chore: Update discovery artifacts (#1462)

## Deleted keys were detected in the following stable discovery artifacts:
sqladmin v1 https://github.com/googleapis/google-api-python-client/commit/cef24d829ab5be71563a2b668b8f6cf5dda2c8e4

## Deleted keys were detected in the following pre-stable discovery artifacts:
alertcenter v1beta1 https://github.com/googleapis/google-api-python-client/commit/70810a52c85c6d0d6f00d7afb41c8608261eaebc

## Discovery Artifact Change Summary:
feat(alertcenter): update the api https://github.com/googleapis/google-api-python-client/commit/70810a52c85c6d0d6f00d7afb41c8608261eaebc
feat(chat): update the api https://github.com/googleapis/google-api-python-client/commit/a577cd0b71951176bbf849c1f7f139127205da54
feat(cloudbuild): update the api https://github.com/googleapis/google-api-python-client/commit/9066056a8b106d441fb7686fe84359484d0d58bc
feat(content): update the api https://github.com/googleapis/google-api-python-client/commit/b123349da33c11c0172a8efb3fadef685a30e6e1
feat(displayvideo): update the api https://github.com/googleapis/google-api-python-client/commit/c525d726ee6cffdd4bc7afd69080d5e52bae83a0
feat(dns): update the api https://github.com/googleapis/google-api-python-client/commit/13436ccd2b835fda5cb86952ac4ea991ee8651d8
feat(eventarc): update the api https://github.com/googleapis/google-api-python-client/commit/6be3394a64a5eb509f68ef779680fd36837708ee
feat(file): update the api https://github.com/googleapis/google-api-python-client/commit/817a0e636771445a988ef479bd52740f754b901a
feat(monitoring): update the api https://github.com/googleapis/google-api-python-client/commit/bd32149f308467f0f659119587afc77dcec65b14
feat(people): update the api https://github.com/googleapis/google-api-python-client/commit/aa6b47df40c5289f33aef6fb6aa007df2d038e20
feat(retail): update the api https://github.com/googleapis/google-api-python-client/commit/d39f06e2d77034bc837604a41dd52c577f158bf2
feat(securitycenter): update the api https://github.com/googleapis/google-api-python-client/commit/999fab5178208639c9eef289f9f441052ed832fc
feat(speech): update the api https://github.com/googleapis/google-api-python-client/commit/3b2c0fa62b2a0c86bba1e97f1b18f93250dbd551
feat(sqladmin): update the api https://github.com/googleapis/google-api-python-client/commit/cef24d829ab5be71563a2b668b8f6cf5dda2c8e4
diff --git a/docs/dyn/admin_directory_v1.asps.html b/docs/dyn/admin_directory_v1.asps.html
index ebf5f9f..d550b01 100644
--- a/docs/dyn/admin_directory_v1.asps.html
+++ b/docs/dyn/admin_directory_v1.asps.html
@@ -79,13 +79,13 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#delete">delete(userKey, codeId, x__xgafv=None)</a></code></p>
-<p class="firstline">Delete an ASP issued by a user.</p>
+<p class="firstline">Deletes an ASP issued by a user.</p>
 <p class="toc_element">
   <code><a href="#get">get(userKey, codeId, x__xgafv=None)</a></code></p>
-<p class="firstline">Get information about an ASP issued by a user.</p>
+<p class="firstline">Gets information about an ASP issued by a user.</p>
 <p class="toc_element">
   <code><a href="#list">list(userKey, x__xgafv=None)</a></code></p>
-<p class="firstline">List the ASPs issued by a user.</p>
+<p class="firstline">Lists the ASPs issued by a user.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -94,7 +94,7 @@
 
 <div class="method">
     <code class="details" id="delete">delete(userKey, codeId, x__xgafv=None)</code>
-  <pre>Delete an ASP issued by a user.
+  <pre>Deletes an ASP issued by a user.
 
 Args:
   userKey: string, Identifies the user in the API request. The value can be the user&#x27;s primary email address, alias email address, or unique user ID. (required)
@@ -108,7 +108,7 @@
 
 <div class="method">
     <code class="details" id="get">get(userKey, codeId, x__xgafv=None)</code>
-  <pre>Get information about an ASP issued by a user.
+  <pre>Gets information about an ASP issued by a user.
 
 Args:
   userKey: string, Identifies the user in the API request. The value can be the user&#x27;s primary email address, alias email address, or unique user ID. (required)
@@ -134,7 +134,7 @@
 
 <div class="method">
     <code class="details" id="list">list(userKey, x__xgafv=None)</code>
-  <pre>List the ASPs issued by a user.
+  <pre>Lists the ASPs issued by a user.
 
 Args:
   userKey: string, Identifies the user in the API request. The value can be the user&#x27;s primary email address, alias email address, or unique user ID. (required)
diff --git a/docs/dyn/admin_directory_v1.channels.html b/docs/dyn/admin_directory_v1.channels.html
index e7d3db3..09c2fde 100644
--- a/docs/dyn/admin_directory_v1.channels.html
+++ b/docs/dyn/admin_directory_v1.channels.html
@@ -79,7 +79,7 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#stop">stop(body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Stop watching resources through this channel.</p>
+<p class="firstline">Stops watching resources through this channel.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -88,7 +88,7 @@
 
 <div class="method">
     <code class="details" id="stop">stop(body=None, x__xgafv=None)</code>
-  <pre>Stop watching resources through this channel.
+  <pre>Stops watching resources through this channel.
 
 Args:
   body: object, The request body.
diff --git a/docs/dyn/admin_directory_v1.chromeosdevices.html b/docs/dyn/admin_directory_v1.chromeosdevices.html
index dfe6ef7..f7a6fce 100644
--- a/docs/dyn/admin_directory_v1.chromeosdevices.html
+++ b/docs/dyn/admin_directory_v1.chromeosdevices.html
@@ -91,7 +91,7 @@
 <p class="firstline">Retrieves the next page of results.</p>
 <p class="toc_element">
   <code><a href="#moveDevicesToOu">moveDevicesToOu(customerId, orgUnitPath, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Move or insert multiple Chrome OS devices to an organizational unit. You can move up to 50 devices at once.</p>
+<p class="firstline">Moves or inserts multiple Chrome OS devices to an organizational unit. You can move up to 50 devices at once.</p>
 <p class="toc_element">
   <code><a href="#patch">patch(customerId, deviceId, body=None, projection=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a device's updatable properties, such as `annotatedUser`, `annotatedLocation`, `notes`, `orgUnitPath`, or `annotatedAssetId`. This method supports [patch semantics](/admin-sdk/directory/v1/guides/performance#patch).</p>
@@ -417,7 +417,7 @@
 
 <div class="method">
     <code class="details" id="moveDevicesToOu">moveDevicesToOu(customerId, orgUnitPath, body=None, x__xgafv=None)</code>
-  <pre>Move or insert multiple Chrome OS devices to an organizational unit. You can move up to 50 devices at once.
+  <pre>Moves or inserts multiple Chrome OS devices to an organizational unit. You can move up to 50 devices at once.
 
 Args:
   customerId: string, Immutable ID of the Google Workspace account (required)
diff --git a/docs/dyn/admin_directory_v1.customers.html b/docs/dyn/admin_directory_v1.customers.html
index 186f08a..0acd765 100644
--- a/docs/dyn/admin_directory_v1.customers.html
+++ b/docs/dyn/admin_directory_v1.customers.html
@@ -87,7 +87,7 @@
 <p class="firstline">Retrieves a customer.</p>
 <p class="toc_element">
   <code><a href="#patch">patch(customerKey, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Patch Customers via Apiary Patch Orchestration</p>
+<p class="firstline">Patches a customer.</p>
 <p class="toc_element">
   <code><a href="#update">update(customerKey, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a customer.</p>
@@ -136,7 +136,7 @@
 
 <div class="method">
     <code class="details" id="patch">patch(customerKey, body=None, x__xgafv=None)</code>
-  <pre>Patch Customers via Apiary Patch Orchestration
+  <pre>Patches a customer.
 
 Args:
   customerKey: string, Id of the customer to be updated (required)
diff --git a/docs/dyn/admin_directory_v1.groups.html b/docs/dyn/admin_directory_v1.groups.html
index c13d4ea..bd2d855 100644
--- a/docs/dyn/admin_directory_v1.groups.html
+++ b/docs/dyn/admin_directory_v1.groups.html
@@ -93,7 +93,7 @@
 <p class="firstline">Creates a group.</p>
 <p class="toc_element">
   <code><a href="#list">list(customer=None, domain=None, maxResults=None, orderBy=None, pageToken=None, query=None, sortOrder=None, userKey=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Retrieve all groups of a domain or of a user given a userKey (paginated)</p>
+<p class="firstline">Retrieves all groups of a domain or of a user given a userKey (paginated).</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>
@@ -207,7 +207,7 @@
 
 <div class="method">
     <code class="details" id="list">list(customer=None, domain=None, maxResults=None, orderBy=None, pageToken=None, query=None, sortOrder=None, userKey=None, x__xgafv=None)</code>
-  <pre>Retrieve all groups of a domain or of a user given a userKey (paginated)
+  <pre>Retrieves all groups of a domain or of a user given a userKey (paginated).
 
 Args:
   customer: string, The unique ID for the customer&#x27;s Google Workspace account. In case of a multi-domain account, to fetch all groups for a customer, fill this field instead of domain. As an account administrator, you can also use the `my_customer` alias to represent your account&#x27;s `customerId`. The `customerId` is also returned as part of the [Users](/admin-sdk/directory/v1/reference/users)
diff --git a/docs/dyn/admin_directory_v1.resources.buildings.html b/docs/dyn/admin_directory_v1.resources.buildings.html
index c0125eb..e2a8132 100644
--- a/docs/dyn/admin_directory_v1.resources.buildings.html
+++ b/docs/dyn/admin_directory_v1.resources.buildings.html
@@ -94,7 +94,7 @@
 <p class="firstline">Retrieves the next page of results.</p>
 <p class="toc_element">
   <code><a href="#patch">patch(customer, buildingId, body=None, coordinatesSource=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Patches a building via Apiary Patch Orchestration.</p>
+<p class="firstline">Patches a building.</p>
 <p class="toc_element">
   <code><a href="#update">update(customer, buildingId, body=None, coordinatesSource=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a building.</p>
@@ -301,7 +301,7 @@
 
 <div class="method">
     <code class="details" id="patch">patch(customer, buildingId, body=None, coordinatesSource=None, x__xgafv=None)</code>
-  <pre>Patches a building via Apiary Patch Orchestration.
+  <pre>Patches a building.
 
 Args:
   customer: string, The unique ID for the customer&#x27;s Google Workspace account. As an account administrator, you can also use the `my_customer` alias to represent your account&#x27;s customer ID. (required)
diff --git a/docs/dyn/admin_directory_v1.resources.calendars.html b/docs/dyn/admin_directory_v1.resources.calendars.html
index 23790b7..1984e48 100644
--- a/docs/dyn/admin_directory_v1.resources.calendars.html
+++ b/docs/dyn/admin_directory_v1.resources.calendars.html
@@ -94,7 +94,7 @@
 <p class="firstline">Retrieves the next page of results.</p>
 <p class="toc_element">
   <code><a href="#patch">patch(customer, calendarResourceId, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Patches a calendar resource via Apiary Patch Orchestration.</p>
+<p class="firstline">Patches a calendar resource.</p>
 <p class="toc_element">
   <code><a href="#update">update(customer, calendarResourceId, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a calendar resource. This method supports patch semantics, meaning you only need to include the fields you wish to update. Fields that are not present in the request will be preserved.</p>
@@ -266,7 +266,7 @@
 
 <div class="method">
     <code class="details" id="patch">patch(customer, calendarResourceId, body=None, x__xgafv=None)</code>
-  <pre>Patches a calendar resource via Apiary Patch Orchestration.
+  <pre>Patches a calendar resource.
 
 Args:
   customer: string, The unique ID for the customer&#x27;s Google Workspace account. As an account administrator, you can also use the `my_customer` alias to represent your account&#x27;s customer ID. (required)
diff --git a/docs/dyn/admin_directory_v1.resources.features.html b/docs/dyn/admin_directory_v1.resources.features.html
index 30178cf..c361db1 100644
--- a/docs/dyn/admin_directory_v1.resources.features.html
+++ b/docs/dyn/admin_directory_v1.resources.features.html
@@ -94,7 +94,7 @@
 <p class="firstline">Retrieves the next page of results.</p>
 <p class="toc_element">
   <code><a href="#patch">patch(customer, featureKey, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Patches a feature via Apiary Patch Orchestration.</p>
+<p class="firstline">Patches a feature.</p>
 <p class="toc_element">
   <code><a href="#rename">rename(customer, oldName, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Renames a feature.</p>
@@ -219,7 +219,7 @@
 
 <div class="method">
     <code class="details" id="patch">patch(customer, featureKey, body=None, x__xgafv=None)</code>
-  <pre>Patches a feature via Apiary Patch Orchestration.
+  <pre>Patches a feature.
 
 Args:
   customer: string, The unique ID for the customer&#x27;s Google Workspace account. As an account administrator, you can also use the `my_customer` alias to represent your account&#x27;s customer ID. (required)
diff --git a/docs/dyn/admin_directory_v1.roleAssignments.html b/docs/dyn/admin_directory_v1.roleAssignments.html
index 07fbdcb..afe5657 100644
--- a/docs/dyn/admin_directory_v1.roleAssignments.html
+++ b/docs/dyn/admin_directory_v1.roleAssignments.html
@@ -82,7 +82,7 @@
 <p class="firstline">Deletes a role assignment.</p>
 <p class="toc_element">
   <code><a href="#get">get(customer, roleAssignmentId, x__xgafv=None)</a></code></p>
-<p class="firstline">Retrieve a role assignment.</p>
+<p class="firstline">Retrieves a role assignment.</p>
 <p class="toc_element">
   <code><a href="#insert">insert(customer, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Creates a role assignment.</p>
@@ -114,7 +114,7 @@
 
 <div class="method">
     <code class="details" id="get">get(customer, roleAssignmentId, x__xgafv=None)</code>
-  <pre>Retrieve a role assignment.
+  <pre>Retrieves a role assignment.
 
 Args:
   customer: string, Immutable ID of the Google Workspace account. (required)
diff --git a/docs/dyn/admin_directory_v1.roles.html b/docs/dyn/admin_directory_v1.roles.html
index 91ba4c9..0cc6a57 100644
--- a/docs/dyn/admin_directory_v1.roles.html
+++ b/docs/dyn/admin_directory_v1.roles.html
@@ -94,7 +94,7 @@
 <p class="firstline">Retrieves the next page of results.</p>
 <p class="toc_element">
   <code><a href="#patch">patch(customer, roleId, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Patch role via Apiary Patch Orchestration</p>
+<p class="firstline">Patches a role.</p>
 <p class="toc_element">
   <code><a href="#update">update(customer, roleId, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a role.</p>
@@ -256,7 +256,7 @@
 
 <div class="method">
     <code class="details" id="patch">patch(customer, roleId, body=None, x__xgafv=None)</code>
-  <pre>Patch role via Apiary Patch Orchestration
+  <pre>Patches a role.
 
 Args:
   customer: string, Immutable ID of the Google Workspace account. (required)
diff --git a/docs/dyn/admin_directory_v1.schemas.html b/docs/dyn/admin_directory_v1.schemas.html
index 9abf078..b4f8425 100644
--- a/docs/dyn/admin_directory_v1.schemas.html
+++ b/docs/dyn/admin_directory_v1.schemas.html
@@ -79,22 +79,22 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#delete">delete(customerId, schemaKey, x__xgafv=None)</a></code></p>
-<p class="firstline">Delete schema</p>
+<p class="firstline">Deletes a schema.</p>
 <p class="toc_element">
   <code><a href="#get">get(customerId, schemaKey, x__xgafv=None)</a></code></p>
-<p class="firstline">Retrieve schema</p>
+<p class="firstline">Retrieves a schema.</p>
 <p class="toc_element">
   <code><a href="#insert">insert(customerId, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Create schema.</p>
+<p class="firstline">Creates a schema.</p>
 <p class="toc_element">
   <code><a href="#list">list(customerId, x__xgafv=None)</a></code></p>
-<p class="firstline">Retrieve all schemas for a customer</p>
+<p class="firstline">Retrieves all schemas for a customer.</p>
 <p class="toc_element">
   <code><a href="#patch">patch(customerId, schemaKey, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Patch Schema via Apiary Patch Orchestration</p>
+<p class="firstline">Patches a schema.</p>
 <p class="toc_element">
   <code><a href="#update">update(customerId, schemaKey, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Update schema</p>
+<p class="firstline">Updates a schema.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -103,7 +103,7 @@
 
 <div class="method">
     <code class="details" id="delete">delete(customerId, schemaKey, x__xgafv=None)</code>
-  <pre>Delete schema
+  <pre>Deletes a schema.
 
 Args:
   customerId: string, Immutable ID of the Google Workspace account. (required)
@@ -117,7 +117,7 @@
 
 <div class="method">
     <code class="details" id="get">get(customerId, schemaKey, x__xgafv=None)</code>
-  <pre>Retrieve schema
+  <pre>Retrieves a schema.
 
 Args:
   customerId: string, Immutable ID of the Google Workspace account. (required)
@@ -158,7 +158,7 @@
 
 <div class="method">
     <code class="details" id="insert">insert(customerId, body=None, x__xgafv=None)</code>
-  <pre>Create schema.
+  <pre>Creates a schema.
 
 Args:
   customerId: string, Immutable ID of the Google Workspace account. (required)
@@ -226,7 +226,7 @@
 
 <div class="method">
     <code class="details" id="list">list(customerId, x__xgafv=None)</code>
-  <pre>Retrieve all schemas for a customer
+  <pre>Retrieves all schemas for a customer.
 
 Args:
   customerId: string, Immutable ID of the Google Workspace account. (required)
@@ -272,7 +272,7 @@
 
 <div class="method">
     <code class="details" id="patch">patch(customerId, schemaKey, body=None, x__xgafv=None)</code>
-  <pre>Patch Schema via Apiary Patch Orchestration
+  <pre>Patches a schema.
 
 Args:
   customerId: string, Immutable ID of the Google Workspace account. (required)
@@ -341,7 +341,7 @@
 
 <div class="method">
     <code class="details" id="update">update(customerId, schemaKey, body=None, x__xgafv=None)</code>
-  <pre>Update schema
+  <pre>Updates a schema.
 
 Args:
   customerId: string, Immutable ID of the Google Workspace account. (required)
diff --git a/docs/dyn/admin_directory_v1.tokens.html b/docs/dyn/admin_directory_v1.tokens.html
index f54c70d..ffdae35 100644
--- a/docs/dyn/admin_directory_v1.tokens.html
+++ b/docs/dyn/admin_directory_v1.tokens.html
@@ -79,10 +79,10 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#delete">delete(userKey, clientId, x__xgafv=None)</a></code></p>
-<p class="firstline">Delete all access tokens issued by a user for an application.</p>
+<p class="firstline">Deletes all access tokens issued by a user for an application.</p>
 <p class="toc_element">
   <code><a href="#get">get(userKey, clientId, x__xgafv=None)</a></code></p>
-<p class="firstline">Get information about an access token issued by a user.</p>
+<p class="firstline">Gets information about an access token issued by a user.</p>
 <p class="toc_element">
   <code><a href="#list">list(userKey, x__xgafv=None)</a></code></p>
 <p class="firstline">Returns the set of tokens specified user has issued to 3rd party applications.</p>
@@ -94,7 +94,7 @@
 
 <div class="method">
     <code class="details" id="delete">delete(userKey, clientId, x__xgafv=None)</code>
-  <pre>Delete all access tokens issued by a user for an application.
+  <pre>Deletes all access tokens issued by a user for an application.
 
 Args:
   userKey: string, Identifies the user in the API request. The value can be the user&#x27;s primary email address, alias email address, or unique user ID. (required)
@@ -108,7 +108,7 @@
 
 <div class="method">
     <code class="details" id="get">get(userKey, clientId, x__xgafv=None)</code>
-  <pre>Get information about an access token issued by a user.
+  <pre>Gets information about an access token issued by a user.
 
 Args:
   userKey: string, Identifies the user in the API request. The value can be the user&#x27;s primary email address, alias email address, or unique user ID. (required)
diff --git a/docs/dyn/admin_directory_v1.twoStepVerification.html b/docs/dyn/admin_directory_v1.twoStepVerification.html
index a52e093..f5c168f 100644
--- a/docs/dyn/admin_directory_v1.twoStepVerification.html
+++ b/docs/dyn/admin_directory_v1.twoStepVerification.html
@@ -79,7 +79,7 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#turnOff">turnOff(userKey, x__xgafv=None)</a></code></p>
-<p class="firstline">Turn off 2-Step Verification for user.</p>
+<p class="firstline">Turns off 2-Step Verification for user.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -88,7 +88,7 @@
 
 <div class="method">
     <code class="details" id="turnOff">turnOff(userKey, x__xgafv=None)</code>
-  <pre>Turn off 2-Step Verification for user.
+  <pre>Turns off 2-Step Verification for user.
 
 Args:
   userKey: string, Identifies the user in the API request. The value can be the user&#x27;s primary email address, alias email address, or unique user ID. (required)
diff --git a/docs/dyn/admin_directory_v1.users.aliases.html b/docs/dyn/admin_directory_v1.users.aliases.html
index 6bc50e7..619d564 100644
--- a/docs/dyn/admin_directory_v1.users.aliases.html
+++ b/docs/dyn/admin_directory_v1.users.aliases.html
@@ -88,7 +88,7 @@
 <p class="firstline">Lists all aliases for a user.</p>
 <p class="toc_element">
   <code><a href="#watch">watch(userKey, body=None, event=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Watch for changes in users list.</p>
+<p class="firstline">Watches for changes in users list.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -172,7 +172,7 @@
 
 <div class="method">
     <code class="details" id="watch">watch(userKey, body=None, event=None, x__xgafv=None)</code>
-  <pre>Watch for changes in users list.
+  <pre>Watches for changes in users list.
 
 Args:
   userKey: string, Email or immutable ID of the user (required)
diff --git a/docs/dyn/admin_directory_v1.users.html b/docs/dyn/admin_directory_v1.users.html
index a7cad60..481edf6 100644
--- a/docs/dyn/admin_directory_v1.users.html
+++ b/docs/dyn/admin_directory_v1.users.html
@@ -110,7 +110,7 @@
 <p class="firstline">Updates a user using patch semantics. The update method should be used instead, since it also supports patch semantics and has better performance. This method is unable to clear fields that contain repeated objects (`addresses`, `phones`, etc). Use the update method instead.</p>
 <p class="toc_element">
   <code><a href="#signOut">signOut(userKey, x__xgafv=None)</a></code></p>
-<p class="firstline">Sign a user out of all web and device sessions and reset their sign-in cookies. User will have to sign in by authenticating again.</p>
+<p class="firstline">Signs a user out of all web and device sessions and reset their sign-in cookies. User will have to sign in by authenticating again.</p>
 <p class="toc_element">
   <code><a href="#undelete">undelete(userKey, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Undeletes a deleted user.</p>
@@ -119,7 +119,7 @@
 <p class="firstline">Updates a user. This method supports patch semantics, meaning you only need to include the fields you wish to update. Fields that are not present in the request will be preserved, and fields set to `null` will be cleared.</p>
 <p class="toc_element">
   <code><a href="#watch">watch(body=None, customFieldMask=None, customer=None, domain=None, event=None, maxResults=None, orderBy=None, pageToken=None, projection=None, query=None, showDeleted=None, sortOrder=None, viewType=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Watch for changes in users list</p>
+<p class="firstline">Watches for changes in users list.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -655,7 +655,7 @@
 
 <div class="method">
     <code class="details" id="signOut">signOut(userKey, x__xgafv=None)</code>
-  <pre>Sign a user out of all web and device sessions and reset their sign-in cookies. User will have to sign in by authenticating again.
+  <pre>Signs a user out of all web and device sessions and reset their sign-in cookies. User will have to sign in by authenticating again.
 
 Args:
   userKey: string, Identifies the target user in the API request. The value can be the user&#x27;s primary email address, alias email address, or unique user ID. (required)
@@ -828,7 +828,7 @@
 
 <div class="method">
     <code class="details" id="watch">watch(body=None, customFieldMask=None, customer=None, domain=None, event=None, maxResults=None, orderBy=None, pageToken=None, projection=None, query=None, showDeleted=None, sortOrder=None, viewType=None, x__xgafv=None)</code>
-  <pre>Watch for changes in users list
+  <pre>Watches for changes in users list.
 
 Args:
   body: object, The request body.
diff --git a/docs/dyn/admin_directory_v1.verificationCodes.html b/docs/dyn/admin_directory_v1.verificationCodes.html
index e04a579..d78c119 100644
--- a/docs/dyn/admin_directory_v1.verificationCodes.html
+++ b/docs/dyn/admin_directory_v1.verificationCodes.html
@@ -79,10 +79,10 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#generate">generate(userKey, x__xgafv=None)</a></code></p>
-<p class="firstline">Generate new backup verification codes for the user.</p>
+<p class="firstline">Generates new backup verification codes for the user.</p>
 <p class="toc_element">
   <code><a href="#invalidate">invalidate(userKey, x__xgafv=None)</a></code></p>
-<p class="firstline">Invalidate the current backup verification codes for the user.</p>
+<p class="firstline">Invalidates the current backup verification codes for the user.</p>
 <p class="toc_element">
   <code><a href="#list">list(userKey, x__xgafv=None)</a></code></p>
 <p class="firstline">Returns the current set of valid backup verification codes for the specified user.</p>
@@ -94,7 +94,7 @@
 
 <div class="method">
     <code class="details" id="generate">generate(userKey, x__xgafv=None)</code>
-  <pre>Generate new backup verification codes for the user.
+  <pre>Generates new backup verification codes for the user.
 
 Args:
   userKey: string, Email or immutable ID of the user (required)
@@ -107,7 +107,7 @@
 
 <div class="method">
     <code class="details" id="invalidate">invalidate(userKey, x__xgafv=None)</code>
-  <pre>Invalidate the current backup verification codes for the user.
+  <pre>Invalidates the current backup verification codes for the user.
 
 Args:
   userKey: string, Email or immutable ID of the user (required)
diff --git a/docs/dyn/analyticsadmin_v1alpha.accounts.html b/docs/dyn/analyticsadmin_v1alpha.accounts.html
index deae014..00a4c19 100644
--- a/docs/dyn/analyticsadmin_v1alpha.accounts.html
+++ b/docs/dyn/analyticsadmin_v1alpha.accounts.html
@@ -374,7 +374,7 @@
             &quot;customMetric&quot;: { # A definition for a custom metric. # A snapshot of a CustomMetric resource in change history.
               &quot;description&quot;: &quot;A String&quot;, # Optional. Description for this custom dimension. Max length of 150 characters.
               &quot;displayName&quot;: &quot;A String&quot;, # Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display names may contain square brackets, but updates to this field will never permit square brackets.
-              &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. Immutable. The type for the custom metric&#x27;s value.
+              &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. The type for the custom metric&#x27;s value.
               &quot;name&quot;: &quot;A String&quot;, # Output only. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}
               &quot;parameterName&quot;: &quot;A String&quot;, # Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting with a letter. Max length of 40 characters for event-scoped metrics.
               &quot;scope&quot;: &quot;A String&quot;, # Required. Immutable. The scope of this custom metric.
@@ -491,7 +491,7 @@
             &quot;customMetric&quot;: { # A definition for a custom metric. # A snapshot of a CustomMetric resource in change history.
               &quot;description&quot;: &quot;A String&quot;, # Optional. Description for this custom dimension. Max length of 150 characters.
               &quot;displayName&quot;: &quot;A String&quot;, # Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display names may contain square brackets, but updates to this field will never permit square brackets.
-              &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. Immutable. The type for the custom metric&#x27;s value.
+              &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. The type for the custom metric&#x27;s value.
               &quot;name&quot;: &quot;A String&quot;, # Output only. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}
               &quot;parameterName&quot;: &quot;A String&quot;, # Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting with a letter. Max length of 40 characters for event-scoped metrics.
               &quot;scope&quot;: &quot;A String&quot;, # Required. Immutable. The scope of this custom metric.
diff --git a/docs/dyn/analyticsadmin_v1alpha.properties.customMetrics.html b/docs/dyn/analyticsadmin_v1alpha.properties.customMetrics.html
index 9355f25..0424452 100644
--- a/docs/dyn/analyticsadmin_v1alpha.properties.customMetrics.html
+++ b/docs/dyn/analyticsadmin_v1alpha.properties.customMetrics.html
@@ -137,7 +137,7 @@
 { # A definition for a custom metric.
   &quot;description&quot;: &quot;A String&quot;, # Optional. Description for this custom dimension. Max length of 150 characters.
   &quot;displayName&quot;: &quot;A String&quot;, # Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display names may contain square brackets, but updates to this field will never permit square brackets.
-  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. Immutable. The type for the custom metric&#x27;s value.
+  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. The type for the custom metric&#x27;s value.
   &quot;name&quot;: &quot;A String&quot;, # Output only. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}
   &quot;parameterName&quot;: &quot;A String&quot;, # Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting with a letter. Max length of 40 characters for event-scoped metrics.
   &quot;scope&quot;: &quot;A String&quot;, # Required. Immutable. The scope of this custom metric.
@@ -154,7 +154,7 @@
     { # A definition for a custom metric.
   &quot;description&quot;: &quot;A String&quot;, # Optional. Description for this custom dimension. Max length of 150 characters.
   &quot;displayName&quot;: &quot;A String&quot;, # Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display names may contain square brackets, but updates to this field will never permit square brackets.
-  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. Immutable. The type for the custom metric&#x27;s value.
+  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. The type for the custom metric&#x27;s value.
   &quot;name&quot;: &quot;A String&quot;, # Output only. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}
   &quot;parameterName&quot;: &quot;A String&quot;, # Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting with a letter. Max length of 40 characters for event-scoped metrics.
   &quot;scope&quot;: &quot;A String&quot;, # Required. Immutable. The scope of this custom metric.
@@ -178,7 +178,7 @@
     { # A definition for a custom metric.
   &quot;description&quot;: &quot;A String&quot;, # Optional. Description for this custom dimension. Max length of 150 characters.
   &quot;displayName&quot;: &quot;A String&quot;, # Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display names may contain square brackets, but updates to this field will never permit square brackets.
-  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. Immutable. The type for the custom metric&#x27;s value.
+  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. The type for the custom metric&#x27;s value.
   &quot;name&quot;: &quot;A String&quot;, # Output only. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}
   &quot;parameterName&quot;: &quot;A String&quot;, # Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting with a letter. Max length of 40 characters for event-scoped metrics.
   &quot;scope&quot;: &quot;A String&quot;, # Required. Immutable. The scope of this custom metric.
@@ -206,7 +206,7 @@
     { # A definition for a custom metric.
       &quot;description&quot;: &quot;A String&quot;, # Optional. Description for this custom dimension. Max length of 150 characters.
       &quot;displayName&quot;: &quot;A String&quot;, # Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display names may contain square brackets, but updates to this field will never permit square brackets.
-      &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. Immutable. The type for the custom metric&#x27;s value.
+      &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. The type for the custom metric&#x27;s value.
       &quot;name&quot;: &quot;A String&quot;, # Output only. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}
       &quot;parameterName&quot;: &quot;A String&quot;, # Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting with a letter. Max length of 40 characters for event-scoped metrics.
       &quot;scope&quot;: &quot;A String&quot;, # Required. Immutable. The scope of this custom metric.
@@ -242,7 +242,7 @@
 { # A definition for a custom metric.
   &quot;description&quot;: &quot;A String&quot;, # Optional. Description for this custom dimension. Max length of 150 characters.
   &quot;displayName&quot;: &quot;A String&quot;, # Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display names may contain square brackets, but updates to this field will never permit square brackets.
-  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. Immutable. The type for the custom metric&#x27;s value.
+  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. The type for the custom metric&#x27;s value.
   &quot;name&quot;: &quot;A String&quot;, # Output only. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}
   &quot;parameterName&quot;: &quot;A String&quot;, # Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting with a letter. Max length of 40 characters for event-scoped metrics.
   &quot;scope&quot;: &quot;A String&quot;, # Required. Immutable. The scope of this custom metric.
@@ -260,7 +260,7 @@
     { # A definition for a custom metric.
   &quot;description&quot;: &quot;A String&quot;, # Optional. Description for this custom dimension. Max length of 150 characters.
   &quot;displayName&quot;: &quot;A String&quot;, # Required. Display name for this custom metric as shown in the Analytics UI. Max length of 82 characters, alphanumeric plus space and underscore starting with a letter. Legacy system-generated display names may contain square brackets, but updates to this field will never permit square brackets.
-  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. Immutable. The type for the custom metric&#x27;s value.
+  &quot;measurementUnit&quot;: &quot;A String&quot;, # Required. The type for the custom metric&#x27;s value.
   &quot;name&quot;: &quot;A String&quot;, # Output only. Resource name for this CustomMetric resource. Format: properties/{property}/customMetrics/{customMetric}
   &quot;parameterName&quot;: &quot;A String&quot;, # Required. Immutable. Tagging name for this custom metric. If this is an event-scoped metric, then this is the event parameter name. May only contain alphanumeric and underscore charactes, starting with a letter. Max length of 40 characters for event-scoped metrics.
   &quot;scope&quot;: &quot;A String&quot;, # Required. Immutable. The scope of this custom metric.
diff --git a/docs/dyn/androidpublisher_v3.edits.bundles.html b/docs/dyn/androidpublisher_v3.edits.bundles.html
index bf11637..9833684 100644
--- a/docs/dyn/androidpublisher_v3.edits.bundles.html
+++ b/docs/dyn/androidpublisher_v3.edits.bundles.html
@@ -104,9 +104,9 @@
 Returns:
   An object of the form:
 
-    { # Response listing all bundles.
-  &quot;bundles&quot;: [ # All bundles.
-    { # Information about a bundle. The resource for BundlesService.
+    { # Response listing all app bundles.
+  &quot;bundles&quot;: [ # All app bundles.
+    { # Information about an app bundle. The resource for BundlesService.
       &quot;sha1&quot;: &quot;A String&quot;, # A sha1 hash of the upload payload, encoded as a hex string and matching the output of the sha1sum command.
       &quot;sha256&quot;: &quot;A String&quot;, # A sha256 hash of the upload payload, encoded as a hex string and matching the output of the sha256sum command.
       &quot;versionCode&quot;: 42, # The version code of the Android App Bundle, as specified in the Android App Bundle&#x27;s base module APK manifest file.
@@ -123,7 +123,7 @@
 Args:
   packageName: string, Package name of the app. (required)
   editId: string, Identifier of the edit. (required)
-  ackBundleInstallationWarning: boolean, Must be set to true if the bundle installation may trigger a warning on user devices (for example, if installation size may be over a threshold, typically 100 MB).
+  ackBundleInstallationWarning: boolean, Must be set to true if the app bundle installation may trigger a warning on user devices (for example, if installation size may be over a threshold, typically 100 MB).
   media_body: string, The filename of the media request body, or an instance of a MediaUpload object.
   media_mime_type: string, The MIME type of the media request body, or an instance of a MediaUpload object.
   x__xgafv: string, V1 error format.
@@ -134,7 +134,7 @@
 Returns:
   An object of the form:
 
-    { # Information about a bundle. The resource for BundlesService.
+    { # Information about an app bundle. The resource for BundlesService.
   &quot;sha1&quot;: &quot;A String&quot;, # A sha1 hash of the upload payload, encoded as a hex string and matching the output of the sha1sum command.
   &quot;sha256&quot;: &quot;A String&quot;, # A sha256 hash of the upload payload, encoded as a hex string and matching the output of the sha256sum command.
   &quot;versionCode&quot;: 42, # The version code of the Android App Bundle, as specified in the Android App Bundle&#x27;s base module APK manifest file.
diff --git a/docs/dyn/chat_v1.dms.conversations.html b/docs/dyn/chat_v1.dms.conversations.html
index 7ea2a8c..032169e 100644
--- a/docs/dyn/chat_v1.dms.conversations.html
+++ b/docs/dyn/chat_v1.dms.conversations.html
@@ -97,6 +97,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -345,6 +870,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
diff --git a/docs/dyn/chat_v1.dms.html b/docs/dyn/chat_v1.dms.html
index 060f7d4..83b6c15 100644
--- a/docs/dyn/chat_v1.dms.html
+++ b/docs/dyn/chat_v1.dms.html
@@ -105,6 +105,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -353,6 +878,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -602,6 +1652,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -850,6 +2425,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
diff --git a/docs/dyn/chat_v1.rooms.conversations.html b/docs/dyn/chat_v1.rooms.conversations.html
index 835c915..e888e5d 100644
--- a/docs/dyn/chat_v1.rooms.conversations.html
+++ b/docs/dyn/chat_v1.rooms.conversations.html
@@ -97,6 +97,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -345,6 +870,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
diff --git a/docs/dyn/chat_v1.rooms.html b/docs/dyn/chat_v1.rooms.html
index d10eab5..c58c820 100644
--- a/docs/dyn/chat_v1.rooms.html
+++ b/docs/dyn/chat_v1.rooms.html
@@ -105,6 +105,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -353,6 +878,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -602,6 +1652,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -850,6 +2425,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
diff --git a/docs/dyn/chat_v1.spaces.html b/docs/dyn/chat_v1.spaces.html
index d987d9d..9aa3452 100644
--- a/docs/dyn/chat_v1.spaces.html
+++ b/docs/dyn/chat_v1.spaces.html
@@ -182,6 +182,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -430,6 +955,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
diff --git a/docs/dyn/chat_v1.spaces.messages.html b/docs/dyn/chat_v1.spaces.messages.html
index bd701f5..b21bf86 100644
--- a/docs/dyn/chat_v1.spaces.messages.html
+++ b/docs/dyn/chat_v1.spaces.messages.html
@@ -111,6 +111,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -359,6 +884,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -631,6 +1681,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -880,6 +2455,531 @@
 
 { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
@@ -1128,6 +3228,531 @@
 
     { # A message in Hangouts Chat.
   &quot;actionResponse&quot;: { # Parameters that a bot can use to configure how it&#x27;s response is posted. # Input only. Parameters that a bot can use to configure how its response is posted.
+    &quot;dialogAction&quot;: { # Contains dialog if present as well as the ActionStatus for the request sent from user. # This response is for Dialog related events and must be accompanied by ResponseType.Dialog
+      &quot;actionStatus&quot;: { # ActionStatus represents status of a request from the bot developer&#x27;s side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be. # Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success.
+        &quot;statusCode&quot;: &quot;A String&quot;, # The status code.
+        &quot;userFacingMessage&quot;: &quot;A String&quot;, # This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.
+      },
+      &quot;dialog&quot;: { # Wrapper around the card body of the dialog. # Dialog for the request.
+        &quot;body&quot;: { # A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { &quot;header&quot;: { &quot;title&quot;: &quot;Heba Salam&quot;, &quot;subtitle&quot;: &quot;Software Engineer&quot;, &quot;imageStyle&quot;: &quot;ImageStyle.AVATAR&quot;, &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot;, &quot;imageAltText&quot;: &quot;Avatar for Heba Salam&quot; }, &quot;sections&quot; : [ { &quot;header&quot;: &quot;Contact Info&quot;, &quot;widgets&quot;: [ { &quot;decorated_text&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;content&quot;: &quot;heba.salam@example.com&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PERSON&quot; }, &quot;content&quot;: &quot;Online&quot; } }, { &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;PHONE&quot; }, &quot;content&quot;: &quot;+1 (555) 555-1234&quot; } }, { &quot;buttons&quot;: [ { &quot;textButton&quot;: { &quot;text&quot;: &quot;Share&quot;, }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/share&quot; } } }, { &quot;textButton&quot;: { &quot;text&quot;: &quot;Edit&quot;, }, &quot;onClick&quot;: { &quot;action&quot;: { &quot;function&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;EDIT&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } } ] } ], &quot;collapsible&quot;: true, &quot;uncollapsibleWidgetsCount&quot;: 3 } ], &quot;cardActions&quot;: [ { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ], &quot;name&quot;: &quot;contact-card-K3wB6arF2H9L&quot; } ``` # Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog.
+          &quot;cardActions&quot;: [ # The actions of this card. They are added to a card&#x27;s generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` &quot;card_actions&quot;: [ { &quot;actionLabel&quot;: &quot;Setting&quot;, &quot;onClick&quot;: { &quot;action&quot;: { &quot;functionName&quot;: &quot;goToView&quot;, &quot;parameters&quot;: [ { &quot;key&quot;: &quot;viewType&quot;, &quot;value&quot;: &quot;SETTING&quot; } ], &quot;loadIndicator&quot;: &quot;LoadIndicator.SPINNER&quot; } } }, { &quot;actionLabel&quot;: &quot;Send Feedback&quot;, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/feedback&quot; } } } ] ```
+            { # A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.
+              &quot;actionLabel&quot;: &quot;A String&quot;, # The label that displays as the action menu item.
+              &quot;onClick&quot;: { # The onclick action for this action item.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+            },
+          ],
+          &quot;displayStyle&quot;: &quot;A String&quot;, # The display style for peekCardHeader.
+          &quot;fixedFooter&quot;: { # A persistent (sticky) footer that is added to the bottom of the card. # The fixed footer shown at the bottom of this card.
+            &quot;primaryButton&quot;: { # A button. Can be a text button or an image button. # The primary button of the fixed footer. The button must be a text button with text and color set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+            &quot;secondaryButton&quot;: { # A button. Can be a text button or an image button. # The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set.
+              &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+              },
+              &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+              &quot;icon&quot;: { # The icon image.
+                &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+              },
+              &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                  &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                  &quot;loadIndicator&quot;: &quot;A String&quot;,
+                  &quot;parameters&quot;: [ # List of action parameters.
+                    { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                      &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                      &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                    },
+                  ],
+                  &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                },
+                &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                  &quot;onClose&quot;: &quot;A String&quot;,
+                  &quot;openAs&quot;: &quot;A String&quot;,
+                  &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                },
+              },
+              &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+            },
+          },
+          &quot;header&quot;: { # The header of the card. A header usually contains a title and an image.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;name&quot;: &quot;A String&quot;, # Name of the card, which is used as a identifier for the card in card navigation.
+          &quot;peekCardHeader&quot;: { # When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards.
+            &quot;imageAltText&quot;: &quot;A String&quot;, # The alternative text of this image which is used for accessibility.
+            &quot;imageType&quot;: &quot;A String&quot;, # The image&#x27;s type.
+            &quot;imageUrl&quot;: &quot;A String&quot;, # The URL of the image in the card header.
+            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the card header.
+            &quot;title&quot;: &quot;A String&quot;, # The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.
+          },
+          &quot;sections&quot;: [ # Sections are separated by a line divider.
+            { # A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.
+              &quot;collapsible&quot;: True or False, # Indicates whether this section is collapsible. If a section is collapsible, the description must be given.
+              &quot;header&quot;: &quot;A String&quot;, # The header of the section. Formatted text is supported.
+              &quot;uncollapsibleWidgetsCount&quot;: 42, # The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.
+              &quot;widgets&quot;: [ # A section must contain at least 1 widget.
+                { # A widget is a UI element that presents texts, images, etc.
+                  &quot;buttonList&quot;: { # A list of buttons layed out horizontally. # A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` &quot;buttonList&quot;: { &quot;buttons&quot;: [ &quot;button&quot;: { &quot;text&quot;: &quot;Edit&quot;, &quot;Color&quot;: { &quot;Red&quot;: 255 &quot;Green&quot;: 255 &quot;Blue&quot;: 255 } &quot;disabled&quot;: true }, &quot;button&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;INVITE&quot; &quot;altText&quot;: &quot;check calendar&quot; }, &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;: &quot;https://example.com/calendar&quot; } } }, ] } ```
+                    &quot;buttons&quot;: [
+                      { # A button. Can be a text button or an image button.
+                        &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                        },
+                        &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                        &quot;icon&quot;: { # The icon image.
+                          &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                          &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                          &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                          &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                        },
+                        &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                          &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                          &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                            &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                            &quot;loadIndicator&quot;: &quot;A String&quot;,
+                            &quot;parameters&quot;: [ # List of action parameters.
+                              { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                                &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                                &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                              },
+                            ],
+                            &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                          },
+                          &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                            &quot;onClose&quot;: &quot;A String&quot;,
+                            &quot;openAs&quot;: &quot;A String&quot;,
+                            &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                          },
+                        },
+                        &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                      },
+                    ],
+                  },
+                  &quot;dateTimePicker&quot;: { # The widget that lets users to specify a date and time. # Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` &quot;date_time_picker&quot;: { &quot;name&quot;: &quot;appointment_time&quot;, &quot;label&quot;: &quot;Book your appointment at:&quot;, &quot;type&quot;: &quot;DateTimePickerType.DATE_AND_TIME&quot;, &quot;valueMsEpoch&quot;: &quot;796435200000&quot; } ```
+                    &quot;label&quot;: &quot;A String&quot;, # The label for the field that displays to the user.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input that&#x27;s used in formInput, and uniquely identifies this input.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;timezoneOffsetDate&quot;: 42, # The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user&#x27;s time zone setting on the client side.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the date/time picker.
+                    &quot;valueMsEpoch&quot;: &quot;A String&quot;, # The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.
+                  },
+                  &quot;decoratedText&quot;: { # A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text. # Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` &quot;decoratedText&quot;: { &quot;icon&quot;: { &quot;knownIcon&quot;: &quot;EMAIL&quot; }, &quot;topLabel&quot;: &quot;Email Address&quot;, &quot;content&quot;: &quot;heba.salam@example.com&quot;, &quot;bottomLabel&quot;: &quot;This is a new Email address!&quot;, &quot;switchWidget&quot;: { &quot;name&quot;: &quot;has_send_welcome_email_to_heba_salam&quot;, &quot;selected&quot;: false, &quot;controlType&quot;: &quot;ControlType.CHECKBOX&quot; } } ```
+                    &quot;bottomLabel&quot;: &quot;A String&quot;, # The formatted text label that shows below the main text.
+                    &quot;button&quot;: { # A button. Can be a text button or an image button. # A button that can be clicked to trigger an action.
+                      &quot;altText&quot;: &quot;A String&quot;, # The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.
+                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # If set, the button is filled with a solid background.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;disabled&quot;: True or False, # If true, the button is displayed in a disabled state and doesn&#x27;t respond to user actions.
+                      &quot;icon&quot;: { # The icon image.
+                        &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                        &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                        &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                        &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                      },
+                      &quot;onClick&quot;: { # The action to perform when the button is clicked.
+                        &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                        &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                          &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                          &quot;loadIndicator&quot;: &quot;A String&quot;,
+                          &quot;parameters&quot;: [ # List of action parameters.
+                            { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                              &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                              &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                            },
+                          ],
+                          &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                        },
+                        &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                          &quot;onClose&quot;: &quot;A String&quot;,
+                          &quot;openAs&quot;: &quot;A String&quot;,
+                          &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                        },
+                      },
+                      &quot;text&quot;: &quot;A String&quot;, # The text of the button.
+                    },
+                    &quot;endIcon&quot;: { # An icon displayed after the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;icon&quot;: { # Deprecated in favor of start_icon.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;onClick&quot;: { # Only the top and bottom label and content region are clickable.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;startIcon&quot;: { # The icon displayed in front of the text.
+                      &quot;altText&quot;: &quot;A String&quot;, # The description of the icon, used for accessibility. The default value is provided if you don&#x27;t specify one.
+                      &quot;iconUrl&quot;: &quot;A String&quot;, # The icon specified by a URL.
+                      &quot;imageType&quot;: &quot;A String&quot;, # The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.
+                      &quot;knownIcon&quot;: &quot;A String&quot;, # The icon specified by the string name of a list of known icons
+                    },
+                    &quot;switchControl&quot;: { # A switch widget can be clicked to change its state or trigger an action.
+                      &quot;controlType&quot;: &quot;A String&quot;, # The control type, either switch or checkbox.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the switch widget that&#x27;s used in formInput.
+                      &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The action when the switch state is changed.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;selected&quot;: True or False, # If the switch is selected.
+                      &quot;value&quot;: &quot;A String&quot;, # The value is what is passed back in the callback.
+                    },
+                    &quot;text&quot;: &quot;A String&quot;, # Required. The main widget formatted text. See Text formatting for details.
+                    &quot;topLabel&quot;: &quot;A String&quot;, # The formatted text label that shows above the main text.
+                    &quot;wrapText&quot;: True or False, # The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.
+                  },
+                  &quot;divider&quot;: { # A divider that appears in between widgets. # Displays a divider. For example, the following JSON creates a divider: ``` &quot;divider&quot;: { } ```
+                  },
+                  &quot;grid&quot;: { # Represents a Grid widget that displays items in a configurable grid layout. # Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` &quot;grid&quot;: { &quot;title&quot;: &quot;A fine collection of items&quot;, &quot;numColumns&quot;: 2, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot;, &quot;cornerRadius&quot;: 4.0 }, &quot;items&quot;: [ &quot;image&quot;: { &quot;imageUri&quot;: &quot;https://www.example.com/image.png&quot;, &quot;cropStyle&quot;: { &quot;type&quot;: &quot;SQUARE&quot; }, &quot;borderStyle&quot;: { &quot;type&quot;: &quot;STROKE&quot; } }, &quot;title&quot;: &quot;An item&quot;, &quot;textAlignment&quot;: &quot;CENTER&quot; ], &quot;onClick&quot;: { &quot;openLink&quot;: { &quot;url&quot;:&quot;https://www.example.com&quot; } } } ```
+                    &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to each grid item.
+                      &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                      &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The border type.
+                    },
+                    &quot;columnCount&quot;: 42, # The number of columns to display in the grid. A default value is used if this field isn&#x27;t specified, and that default value is different depending on where the grid is shown (dialog versus companion).
+                    &quot;items&quot;: [ # The items to display in the grid.
+                      { # Represents a single item in the grid layout.
+                        &quot;id&quot;: &quot;A String&quot;, # A user-specified identifier for this grid item. This identifier is returned in the parent Grid&#x27;s onClick callback parameters.
+                        &quot;image&quot;: { # The image that displays in the grid item.
+                          &quot;altText&quot;: &quot;A String&quot;, # The accessibility label for the image.
+                          &quot;borderStyle&quot;: { # Represents the complete border style applied to widgets. # The border style to apply to the image.
+                            &quot;cornerRadius&quot;: 42, # The corner radius for the border.
+                            &quot;strokeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor&#x27;s `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn&#x27;t carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha &lt;= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!(&#x27;alpha&#x27; in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(&#x27;,&#x27;); return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = [&#x27;#&#x27;]; for (var i = 0; i &lt; missingZeros; i++) { resultBuilder.push(&#x27;0&#x27;); } resultBuilder.push(hexString); return resultBuilder.join(&#x27;&#x27;); }; // ... # The colors to use when the type is `BORDER_TYPE_STROKE`.
+                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).
+                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
+                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
+                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
+                            },
+                            &quot;type&quot;: &quot;A String&quot;, # The border type.
+                          },
+                          &quot;cropStyle&quot;: { # Represents the crop style applied to an image. # The crop style to apply to the image.
+                            &quot;aspectRatio&quot;: 3.14, # The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.
+                            &quot;type&quot;: &quot;A String&quot;, # The crop type.
+                          },
+                          &quot;imageUri&quot;: &quot;A String&quot;, # The image URL.
+                        },
+                        &quot;layout&quot;: &quot;A String&quot;, # The layout to use for the grid item.
+                        &quot;subtitle&quot;: &quot;A String&quot;, # The grid item&#x27;s subtitle.
+                        &quot;textAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the grid item&#x27;s text.
+                        &quot;title&quot;: &quot;A String&quot;, # The grid item&#x27;s title.
+                      },
+                    ],
+                    &quot;onClick&quot;: { # This callback is reused by each individual grid item, but with the item&#x27;s identifier and index in the items list added to the callback&#x27;s parameters.
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                    &quot;title&quot;: &quot;A String&quot;, # The text that displays in the grid header.
+                  },
+                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of this widget.
+                  &quot;image&quot;: { # An image that is specified by a URL and can have an onClick action. # Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` &quot;image&quot;: { &quot;imageUrl&quot;: &quot;https://example.com/heba_salam.png&quot; &quot;altText&quot;: &quot;Avatar for Heba Salam&quot; } ```
+                    &quot;altText&quot;: &quot;A String&quot;, # The alternative text of this image, used for accessibility.
+                    &quot;imageUrl&quot;: &quot;A String&quot;, # An image URL.
+                    &quot;onClick&quot;: {
+                      &quot;action&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, an action is triggered by this onClick.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;card&quot;: # Object with schema name: GoogleAppsCardV1Card # A new card is pushed to the card stack after clicking if specified.
+                      &quot;openDynamicLinkAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back.
+                        &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                        &quot;loadIndicator&quot;: &quot;A String&quot;,
+                        &quot;parameters&quot;: [ # List of action parameters.
+                          { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                            &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                            &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                          },
+                        ],
+                        &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                      },
+                      &quot;openLink&quot;: { # If specified, this onClick triggers an open link action.
+                        &quot;onClose&quot;: &quot;A String&quot;,
+                        &quot;openAs&quot;: &quot;A String&quot;,
+                        &quot;url&quot;: &quot;A String&quot;, # The URL to open.
+                      },
+                    },
+                  },
+                  &quot;selectionInput&quot;: { # A widget that creates a UI item (for example, a drop-down list) with options for users to select. # Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` &quot;switchControl&quot;: { &quot;name&quot;: &quot;size&quot;, &quot;label&quot;: &quot;Size&quot; &quot;type&quot;: &quot;SelectionType.DROPDOWN&quot;, &quot;items&quot;: [ { &quot;text&quot;: &quot;S&quot;, &quot;value&quot;: &quot;small&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;M&quot;, &quot;value&quot;: &quot;medium&quot;, &quot;selected&quot;: true }, { &quot;text&quot;: &quot;L&quot;, &quot;value&quot;: &quot;large&quot;, &quot;selected&quot;: false }, { &quot;text&quot;: &quot;XL&quot;, &quot;value&quot;: &quot;extra_large&quot;, &quot;selected&quot;: false } ] } ```
+                    &quot;items&quot;: [
+                      { # The item in the switch control. A radio button, at most one of the items is selected.
+                        &quot;selected&quot;: True or False, # If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.
+                        &quot;text&quot;: &quot;A String&quot;, # The text to be displayed.
+                        &quot;value&quot;: &quot;A String&quot;, # The value associated with this item. The client should use this as a form input value.
+                      },
+                    ],
+                    &quot;label&quot;: &quot;A String&quot;, # The label displayed ahead of the switch control.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;,
+                  },
+                  &quot;textInput&quot;: { # A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions. # Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;mailing_address&quot;, &quot;label&quot;: &quot;Mailing Address&quot; } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` &quot;textInput&quot;: { &quot;name&quot;: &quot;preferred_programing_language&quot;, &quot;label&quot;: &quot;Preferred Language&quot;, &quot;initialSuggestions&quot;: { &quot;items&quot;: [ { &quot;text&quot;: &quot;C++&quot; }, { &quot;text&quot;: &quot;Java&quot; }, { &quot;text&quot;: &quot;JavaScript&quot; }, { &quot;text&quot;: &quot;Python&quot; } ] } } ```
+                    &quot;autoCompleteAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The refresh function that returns suggestions based on the user&#x27;s input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;hintText&quot;: &quot;A String&quot;, # The hint text.
+                    &quot;initialSuggestions&quot;: { # A container wrapping elements necessary for showing suggestion items used in text input autocomplete. # The initial suggestions made before any user input.
+                      &quot;items&quot;: [ # A list of suggestions items which will be used in are used in autocomplete.
+                        { # A suggestion item. Only supports text for now.
+                          &quot;text&quot;: &quot;A String&quot;,
+                        },
+                      ],
+                    },
+                    &quot;label&quot;: &quot;A String&quot;, # At least one of label and hintText must be specified.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the text input which is used in formInput.
+                    &quot;onChangeAction&quot;: { # An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form. # The onChange action, for example, invoke a function.
+                      &quot;function&quot;: &quot;A String&quot;, # Apps Script function to invoke when the containing element is clicked/activated.
+                      &quot;loadIndicator&quot;: &quot;A String&quot;,
+                      &quot;parameters&quot;: [ # List of action parameters.
+                        { # List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.
+                          &quot;key&quot;: &quot;A String&quot;, # The name of the parameter for the action script.
+                          &quot;value&quot;: &quot;A String&quot;, # The value of the parameter.
+                        },
+                      ],
+                      &quot;persistValues&quot;: True or False, # Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The style of the text, for example, a single line or multiple lines.
+                    &quot;value&quot;: &quot;A String&quot;, # The default value when there is no input from the user.
+                  },
+                  &quot;textParagraph&quot;: { # A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting&quot;) for details. # Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` &quot;textParagraph&quot;: { &quot;text&quot;: &quot; *bold text*&quot; } ```
+                    &quot;text&quot;: &quot;A String&quot;, # The text that&#x27;s shown in the widget.
+                  },
+                },
+              ],
+            },
+          ],
+        },
+      },
+    },
     &quot;type&quot;: &quot;A String&quot;, # The type of bot response.
     &quot;url&quot;: &quot;A String&quot;, # URL for users to auth or config. (Only for REQUEST_CONFIG response types.)
   },
diff --git a/docs/dyn/cloudasset_v1.v1.html b/docs/dyn/cloudasset_v1.v1.html
index a3a7f9b..3f1a469 100644
--- a/docs/dyn/cloudasset_v1.v1.html
+++ b/docs/dyn/cloudasset_v1.v1.html
@@ -79,7 +79,7 @@
 <p class="firstline">Analyzes IAM policies to answer which identities have what accesses on which resources.</p>
 <p class="toc_element">
   <code><a href="#analyzeIamPolicyLongrunning">analyzeIamPolicyLongrunning(scope, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Analyzes IAM policies asynchronously to answer which identities have what accesses on which resources, and writes the analysis results to a Google Cloud Storage or a BigQuery destination. For Cloud Storage destination, the output format is the JSON format that represents a AnalyzeIamPolicyResponse. This method implements the google.longrunning.Operation, which allows you to track the operation status. We recommend intervals of at least 2 seconds with exponential backoff retry to poll the operation result. The metadata contains the request to help callers to map responses to requests.</p>
+<p class="firstline">Analyzes IAM policies asynchronously to answer which identities have what accesses on which resources, and writes the analysis results to a Google Cloud Storage or a BigQuery destination. For Cloud Storage destination, the output format is the JSON format that represents a AnalyzeIamPolicyResponse. This method implements the google.longrunning.Operation, which allows you to track the operation status. We recommend intervals of at least 2 seconds with exponential backoff retry to poll the operation result. The metadata contains the metadata for the long-running operation.</p>
 <p class="toc_element">
   <code><a href="#analyzeMove">analyzeMove(resource, destinationParent=None, view=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Analyze moving a resource to a specified destination without kicking off the actual move. The analysis is best effort depending on the user's permissions of viewing different hierarchical policies and configurations. The policies and configuration are subject to change before the actual resource migration takes place.</p>
@@ -348,7 +348,7 @@
 
 <div class="method">
     <code class="details" id="analyzeIamPolicyLongrunning">analyzeIamPolicyLongrunning(scope, body=None, x__xgafv=None)</code>
-  <pre>Analyzes IAM policies asynchronously to answer which identities have what accesses on which resources, and writes the analysis results to a Google Cloud Storage or a BigQuery destination. For Cloud Storage destination, the output format is the JSON format that represents a AnalyzeIamPolicyResponse. This method implements the google.longrunning.Operation, which allows you to track the operation status. We recommend intervals of at least 2 seconds with exponential backoff retry to poll the operation result. The metadata contains the request to help callers to map responses to requests.
+  <pre>Analyzes IAM policies asynchronously to answer which identities have what accesses on which resources, and writes the analysis results to a Google Cloud Storage or a BigQuery destination. For Cloud Storage destination, the output format is the JSON format that represents a AnalyzeIamPolicyResponse. This method implements the google.longrunning.Operation, which allows you to track the operation status. We recommend intervals of at least 2 seconds with exponential backoff retry to poll the operation result. The metadata contains the metadata for the long-running operation.
 
 Args:
   scope: string, Required. The relative name of the root asset. Only resources and IAM policies within the scope will be analyzed. This can only be an organization number (such as &quot;organizations/123&quot;), a folder number (such as &quot;folders/123&quot;), a project ID (such as &quot;projects/my-project-id&quot;), or a project number (such as &quot;projects/12345&quot;). To know how to get organization id, visit [here ](https://cloud.google.com/resource-manager/docs/creating-managing-organization#retrieving_your_organization_id). To know how to get folder or project id, visit [here ](https://cloud.google.com/resource-manager/docs/creating-managing-folders#viewing_or_listing_folders_and_projects). (required)
diff --git a/docs/dyn/cloudbuild_v1.projects.builds.html b/docs/dyn/cloudbuild_v1.projects.builds.html
index 6ed4772..ffa4e80 100644
--- a/docs/dyn/cloudbuild_v1.projects.builds.html
+++ b/docs/dyn/cloudbuild_v1.projects.builds.html
@@ -154,6 +154,10 @@
   },
   &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+  &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+    &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+    &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+  },
   &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
   &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
   &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -392,6 +396,10 @@
   },
   &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+  &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+    &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+    &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+  },
   &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
   &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
   &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -661,6 +669,10 @@
   },
   &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+  &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+    &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+    &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+  },
   &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
   &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
   &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -905,6 +917,10 @@
       },
       &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+      &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+        &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+        &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+      },
       &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
       &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
       &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
diff --git a/docs/dyn/cloudbuild_v1.projects.locations.builds.html b/docs/dyn/cloudbuild_v1.projects.locations.builds.html
index fb4b582..3e2fd20 100644
--- a/docs/dyn/cloudbuild_v1.projects.locations.builds.html
+++ b/docs/dyn/cloudbuild_v1.projects.locations.builds.html
@@ -153,6 +153,10 @@
   },
   &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+  &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+    &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+    &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+  },
   &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
   &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
   &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -391,6 +395,10 @@
   },
   &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+  &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+    &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+    &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+  },
   &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
   &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
   &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -660,6 +668,10 @@
   },
   &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+  &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+    &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+    &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+  },
   &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
   &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
   &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -904,6 +916,10 @@
       },
       &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+      &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+        &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+        &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+      },
       &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
       &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
       &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
diff --git a/docs/dyn/cloudbuild_v1.projects.locations.triggers.html b/docs/dyn/cloudbuild_v1.projects.locations.triggers.html
index faec061..5c2898e 100644
--- a/docs/dyn/cloudbuild_v1.projects.locations.triggers.html
+++ b/docs/dyn/cloudbuild_v1.projects.locations.triggers.html
@@ -78,7 +78,7 @@
   <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, projectId=None, x__xgafv=None)</a></code></p>
+  <code><a href="#create">create(parent, body, projectId=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Creates a new `BuildTrigger`. This API is experimental.</p>
 <p class="toc_element">
   <code><a href="#delete">delete(name, projectId=None, triggerId=None, x__xgafv=None)</a></code></p>
@@ -93,7 +93,7 @@
   <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="#patch">patch(resourceName, body=None, projectId=None, triggerId=None, x__xgafv=None)</a></code></p>
+  <code><a href="#patch">patch(resourceName, body, projectId=None, triggerId=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a `BuildTrigger` by its project ID and trigger ID. This API is experimental.</p>
 <p class="toc_element">
   <code><a href="#run">run(name, body=None, x__xgafv=None)</a></code></p>
@@ -108,7 +108,7 @@
 </div>
 
 <div class="method">
-    <code class="details" id="create">create(parent, body=None, projectId=None, x__xgafv=None)</code>
+    <code class="details" id="create">create(parent, body, projectId=None, x__xgafv=None)</code>
   <pre>Creates a new `BuildTrigger`. This API is experimental.
 
 Args:
@@ -152,6 +152,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -375,6 +379,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
@@ -444,6 +453,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -667,6 +680,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
@@ -764,6 +782,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -987,6 +1009,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
@@ -1068,6 +1095,10 @@
         },
         &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
         &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+        &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+          &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+          &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+        },
         &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
         &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
         &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -1291,6 +1322,11 @@
         &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
       },
       &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+      &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+        &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+        &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+        &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+      },
       &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
@@ -1333,7 +1369,7 @@
 </div>
 
 <div class="method">
-    <code class="details" id="patch">patch(resourceName, body=None, projectId=None, triggerId=None, x__xgafv=None)</code>
+    <code class="details" id="patch">patch(resourceName, body, projectId=None, triggerId=None, x__xgafv=None)</code>
   <pre>Updates a `BuildTrigger` by its project ID and trigger ID. This API is experimental.
 
 Args:
@@ -1377,6 +1413,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -1600,6 +1640,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
@@ -1670,6 +1715,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -1893,6 +1942,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
diff --git a/docs/dyn/cloudbuild_v1.projects.locations.workerPools.html b/docs/dyn/cloudbuild_v1.projects.locations.workerPools.html
index b154dfe..525a4ac 100644
--- a/docs/dyn/cloudbuild_v1.projects.locations.workerPools.html
+++ b/docs/dyn/cloudbuild_v1.projects.locations.workerPools.html
@@ -247,7 +247,7 @@
   <pre>Lists `WorkerPool`s.
 
 Args:
-  parent: string, Required. The parent of the collection of `WorkerPools`. Format: `projects/{project}/locations/location`. (required)
+  parent: string, Required. The parent of the collection of `WorkerPools`. Format: `projects/{project}/locations/{location}`. (required)
   pageSize: integer, The maximum number of `WorkerPool`s to return. The service may return fewer than this value. If omitted, the server will use a sensible default.
   pageToken: string, A page token, received from a previous `ListWorkerPools` call. Provide this to retrieve the subsequent page.
   x__xgafv: string, V1 error format.
diff --git a/docs/dyn/cloudbuild_v1.projects.triggers.html b/docs/dyn/cloudbuild_v1.projects.triggers.html
index 0ae72e4..14c7e60 100644
--- a/docs/dyn/cloudbuild_v1.projects.triggers.html
+++ b/docs/dyn/cloudbuild_v1.projects.triggers.html
@@ -78,7 +78,7 @@
   <code><a href="#close">close()</a></code></p>
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
-  <code><a href="#create">create(projectId, body=None, parent=None, x__xgafv=None)</a></code></p>
+  <code><a href="#create">create(projectId, body, parent=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Creates a new `BuildTrigger`. This API is experimental.</p>
 <p class="toc_element">
   <code><a href="#delete">delete(projectId, triggerId, name=None, x__xgafv=None)</a></code></p>
@@ -93,7 +93,7 @@
   <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="#patch">patch(projectId, triggerId, body=None, x__xgafv=None)</a></code></p>
+  <code><a href="#patch">patch(projectId, triggerId, body, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a `BuildTrigger` by its project ID and trigger ID. This API is experimental.</p>
 <p class="toc_element">
   <code><a href="#run">run(projectId, triggerId, body=None, name=None, x__xgafv=None)</a></code></p>
@@ -108,7 +108,7 @@
 </div>
 
 <div class="method">
-    <code class="details" id="create">create(projectId, body=None, parent=None, x__xgafv=None)</code>
+    <code class="details" id="create">create(projectId, body, parent=None, x__xgafv=None)</code>
   <pre>Creates a new `BuildTrigger`. This API is experimental.
 
 Args:
@@ -152,6 +152,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -375,6 +379,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
@@ -444,6 +453,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -667,6 +680,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
@@ -764,6 +782,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -987,6 +1009,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
@@ -1068,6 +1095,10 @@
         },
         &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
         &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+        &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+          &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+          &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+        },
         &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
         &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
         &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -1291,6 +1322,11 @@
         &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
       },
       &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+      &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+        &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+        &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+        &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+      },
       &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
@@ -1333,7 +1369,7 @@
 </div>
 
 <div class="method">
-    <code class="details" id="patch">patch(projectId, triggerId, body=None, x__xgafv=None)</code>
+    <code class="details" id="patch">patch(projectId, triggerId, body, x__xgafv=None)</code>
   <pre>Updates a `BuildTrigger` by its project ID and trigger ID. This API is experimental.
 
 Args:
@@ -1378,6 +1414,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -1601,6 +1641,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
@@ -1669,6 +1714,10 @@
     },
     &quot;buildTriggerId&quot;: &quot;A String&quot;, # Output only. The ID of the `BuildTrigger` that triggered this build, if it was triggered automatically.
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. Time at which the request to create the build was received.
+    &quot;failureInfo&quot;: { # A fatal problem encountered during the execution of the build. # Output only. Contains information about the build when status=FAILURE.
+      &quot;detail&quot;: &quot;A String&quot;, # Explains the failure issue in more detail using hard-coded text.
+      &quot;type&quot;: &quot;A String&quot;, # The name of the failure.
+    },
     &quot;finishTime&quot;: &quot;A String&quot;, # Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build&#x27;s execution.
     &quot;id&quot;: &quot;A String&quot;, # Output only. Unique identifier of the build.
     &quot;images&quot;: [ # A list of images to be pushed upon the successful completion of all build steps. The images are pushed using the builder service account&#x27;s credentials. The digests of the pushed images will be stored in the `Build` resource&#x27;s results field. If any of the images fail to be pushed, the build status is marked `FAILURE`.
@@ -1892,6 +1941,11 @@
     &quot;topic&quot;: &quot;A String&quot;, # The name of the topic from which this subscription is receiving messages. Format is `projects/{project}/topics/{topic}`.
   },
   &quot;resourceName&quot;: &quot;A String&quot;, # The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.
+  &quot;sourceToBuild&quot;: { # GitRepoSource describes a repo and ref of a code repository. # The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers.
+    &quot;ref&quot;: &quot;A String&quot;, # The branch or tag to use. Must start with &quot;refs/&quot; (required).
+    &quot;repoType&quot;: &quot;A String&quot;, # See RepoType below.
+    &quot;uri&quot;: &quot;A String&quot;, # The URI of the repo (required).
+  },
   &quot;substitutions&quot;: { # Substitutions for Build resource. The keys must match the following regular expression: `^_[A-Z0-9_]+$`.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
diff --git a/docs/dyn/cloudfunctions_v1.projects.locations.functions.html b/docs/dyn/cloudfunctions_v1.projects.locations.functions.html
index 5f0964a..3c7682a 100644
--- a/docs/dyn/cloudfunctions_v1.projects.locations.functions.html
+++ b/docs/dyn/cloudfunctions_v1.projects.locations.functions.html
@@ -156,7 +156,7 @@
   body: object, The request body.
     The object takes the form of:
 
-{ # Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations.
+{ # Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations. Next tag: 35
   &quot;availableMemoryMb&quot;: 42, # The amount of memory in MB available for a function. Defaults to 256MB.
   &quot;buildEnvironmentVariables&quot;: { # Build environment variables that shall be available during build time.
     &quot;a_key&quot;: &quot;A String&quot;,
@@ -192,7 +192,7 @@
   &quot;secretEnvironmentVariables&quot;: [ # Secret environment variables configuration.
     { # Configuration for a secret environment variable. It has the information necessary to fetch the secret value from secret manager and expose it as an environment variable. Secret value is not a part of the configuration. Secret values are only fetched when a new clone starts.
       &quot;key&quot;: &quot;A String&quot;, # Name of the environment variable.
-      &quot;projectId&quot;: &quot;A String&quot;, # Project whose secret manager data is being referenced. Cross project secrets are not supported.
+      &quot;projectId&quot;: &quot;A String&quot;, # Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function&#x27;s project assuming that the secret exists in the same project as of the function.
       &quot;secret&quot;: &quot;A String&quot;, # Name of the secret in secret manager (not the full resource name).
       &quot;version&quot;: &quot;A String&quot;, # Version of the secret (version number or the string &#x27;latest&#x27;). It is recommended to use a numeric version for secret environment variables as any updates to the secret value is not reflected until new clones start.
     },
@@ -200,7 +200,7 @@
   &quot;secretVolumes&quot;: [ # Secret volumes configuration.
     { # Configuration for a secret volume. It has the information necessary to fetch the secret value from secret manager and make it available as files mounted at the requested paths within the application container. Secret value is not a part of the configuration. Every filesystem read operation performs a lookup in secret manager to retrieve the secret value.
       &quot;mountPath&quot;: &quot;A String&quot;, # The path within the container to mount the secret volume. For example, setting the mount_path as `/etc/secrets` would mount the secret value files under the `/etc/secrets` directory. This directory will also be completely shadowed and unavailable to mount any other secrets. Recommended mount paths: /etc/secrets Restricted mount paths: /cloudsql, /dev/log, /pod, /proc, /var/log
-      &quot;projectId&quot;: &quot;A String&quot;, # Project whose secret manager data is being referenced. Cross project secrets are not supported.
+      &quot;projectId&quot;: &quot;A String&quot;, # Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function&#x27;s project assuming that the secret exists in the same project as of the function.
       &quot;secret&quot;: &quot;A String&quot;, # Name of the secret in secret manager (not the full resource name).
       &quot;versions&quot;: [ # List of secret versions to mount for this secret. If empty, the `latest` version of the secret will be made available in a file named after the secret under the mount point.
         { # Configuration for a single version.
@@ -355,7 +355,7 @@
 Returns:
   An object of the form:
 
-    { # Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations.
+    { # Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations. Next tag: 35
   &quot;availableMemoryMb&quot;: 42, # The amount of memory in MB available for a function. Defaults to 256MB.
   &quot;buildEnvironmentVariables&quot;: { # Build environment variables that shall be available during build time.
     &quot;a_key&quot;: &quot;A String&quot;,
@@ -391,7 +391,7 @@
   &quot;secretEnvironmentVariables&quot;: [ # Secret environment variables configuration.
     { # Configuration for a secret environment variable. It has the information necessary to fetch the secret value from secret manager and expose it as an environment variable. Secret value is not a part of the configuration. Secret values are only fetched when a new clone starts.
       &quot;key&quot;: &quot;A String&quot;, # Name of the environment variable.
-      &quot;projectId&quot;: &quot;A String&quot;, # Project whose secret manager data is being referenced. Cross project secrets are not supported.
+      &quot;projectId&quot;: &quot;A String&quot;, # Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function&#x27;s project assuming that the secret exists in the same project as of the function.
       &quot;secret&quot;: &quot;A String&quot;, # Name of the secret in secret manager (not the full resource name).
       &quot;version&quot;: &quot;A String&quot;, # Version of the secret (version number or the string &#x27;latest&#x27;). It is recommended to use a numeric version for secret environment variables as any updates to the secret value is not reflected until new clones start.
     },
@@ -399,7 +399,7 @@
   &quot;secretVolumes&quot;: [ # Secret volumes configuration.
     { # Configuration for a secret volume. It has the information necessary to fetch the secret value from secret manager and make it available as files mounted at the requested paths within the application container. Secret value is not a part of the configuration. Every filesystem read operation performs a lookup in secret manager to retrieve the secret value.
       &quot;mountPath&quot;: &quot;A String&quot;, # The path within the container to mount the secret volume. For example, setting the mount_path as `/etc/secrets` would mount the secret value files under the `/etc/secrets` directory. This directory will also be completely shadowed and unavailable to mount any other secrets. Recommended mount paths: /etc/secrets Restricted mount paths: /cloudsql, /dev/log, /pod, /proc, /var/log
-      &quot;projectId&quot;: &quot;A String&quot;, # Project whose secret manager data is being referenced. Cross project secrets are not supported.
+      &quot;projectId&quot;: &quot;A String&quot;, # Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function&#x27;s project assuming that the secret exists in the same project as of the function.
       &quot;secret&quot;: &quot;A String&quot;, # Name of the secret in secret manager (not the full resource name).
       &quot;versions&quot;: [ # List of secret versions to mount for this secret. If empty, the `latest` version of the secret will be made available in a file named after the secret under the mount point.
         { # Configuration for a single version.
@@ -492,7 +492,7 @@
 
     { # Response for the `ListFunctions` method.
   &quot;functions&quot;: [ # The functions that match the request.
-    { # Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations.
+    { # Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations. Next tag: 35
       &quot;availableMemoryMb&quot;: 42, # The amount of memory in MB available for a function. Defaults to 256MB.
       &quot;buildEnvironmentVariables&quot;: { # Build environment variables that shall be available during build time.
         &quot;a_key&quot;: &quot;A String&quot;,
@@ -528,7 +528,7 @@
       &quot;secretEnvironmentVariables&quot;: [ # Secret environment variables configuration.
         { # Configuration for a secret environment variable. It has the information necessary to fetch the secret value from secret manager and expose it as an environment variable. Secret value is not a part of the configuration. Secret values are only fetched when a new clone starts.
           &quot;key&quot;: &quot;A String&quot;, # Name of the environment variable.
-          &quot;projectId&quot;: &quot;A String&quot;, # Project whose secret manager data is being referenced. Cross project secrets are not supported.
+          &quot;projectId&quot;: &quot;A String&quot;, # Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function&#x27;s project assuming that the secret exists in the same project as of the function.
           &quot;secret&quot;: &quot;A String&quot;, # Name of the secret in secret manager (not the full resource name).
           &quot;version&quot;: &quot;A String&quot;, # Version of the secret (version number or the string &#x27;latest&#x27;). It is recommended to use a numeric version for secret environment variables as any updates to the secret value is not reflected until new clones start.
         },
@@ -536,7 +536,7 @@
       &quot;secretVolumes&quot;: [ # Secret volumes configuration.
         { # Configuration for a secret volume. It has the information necessary to fetch the secret value from secret manager and make it available as files mounted at the requested paths within the application container. Secret value is not a part of the configuration. Every filesystem read operation performs a lookup in secret manager to retrieve the secret value.
           &quot;mountPath&quot;: &quot;A String&quot;, # The path within the container to mount the secret volume. For example, setting the mount_path as `/etc/secrets` would mount the secret value files under the `/etc/secrets` directory. This directory will also be completely shadowed and unavailable to mount any other secrets. Recommended mount paths: /etc/secrets Restricted mount paths: /cloudsql, /dev/log, /pod, /proc, /var/log
-          &quot;projectId&quot;: &quot;A String&quot;, # Project whose secret manager data is being referenced. Cross project secrets are not supported.
+          &quot;projectId&quot;: &quot;A String&quot;, # Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function&#x27;s project assuming that the secret exists in the same project as of the function.
           &quot;secret&quot;: &quot;A String&quot;, # Name of the secret in secret manager (not the full resource name).
           &quot;versions&quot;: [ # List of secret versions to mount for this secret. If empty, the `latest` version of the secret will be made available in a file named after the secret under the mount point.
             { # Configuration for a single version.
@@ -592,7 +592,7 @@
   body: object, The request body.
     The object takes the form of:
 
-{ # Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations.
+{ # Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations. Next tag: 35
   &quot;availableMemoryMb&quot;: 42, # The amount of memory in MB available for a function. Defaults to 256MB.
   &quot;buildEnvironmentVariables&quot;: { # Build environment variables that shall be available during build time.
     &quot;a_key&quot;: &quot;A String&quot;,
@@ -628,7 +628,7 @@
   &quot;secretEnvironmentVariables&quot;: [ # Secret environment variables configuration.
     { # Configuration for a secret environment variable. It has the information necessary to fetch the secret value from secret manager and expose it as an environment variable. Secret value is not a part of the configuration. Secret values are only fetched when a new clone starts.
       &quot;key&quot;: &quot;A String&quot;, # Name of the environment variable.
-      &quot;projectId&quot;: &quot;A String&quot;, # Project whose secret manager data is being referenced. Cross project secrets are not supported.
+      &quot;projectId&quot;: &quot;A String&quot;, # Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function&#x27;s project assuming that the secret exists in the same project as of the function.
       &quot;secret&quot;: &quot;A String&quot;, # Name of the secret in secret manager (not the full resource name).
       &quot;version&quot;: &quot;A String&quot;, # Version of the secret (version number or the string &#x27;latest&#x27;). It is recommended to use a numeric version for secret environment variables as any updates to the secret value is not reflected until new clones start.
     },
@@ -636,7 +636,7 @@
   &quot;secretVolumes&quot;: [ # Secret volumes configuration.
     { # Configuration for a secret volume. It has the information necessary to fetch the secret value from secret manager and make it available as files mounted at the requested paths within the application container. Secret value is not a part of the configuration. Every filesystem read operation performs a lookup in secret manager to retrieve the secret value.
       &quot;mountPath&quot;: &quot;A String&quot;, # The path within the container to mount the secret volume. For example, setting the mount_path as `/etc/secrets` would mount the secret value files under the `/etc/secrets` directory. This directory will also be completely shadowed and unavailable to mount any other secrets. Recommended mount paths: /etc/secrets Restricted mount paths: /cloudsql, /dev/log, /pod, /proc, /var/log
-      &quot;projectId&quot;: &quot;A String&quot;, # Project whose secret manager data is being referenced. Cross project secrets are not supported.
+      &quot;projectId&quot;: &quot;A String&quot;, # Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function&#x27;s project assuming that the secret exists in the same project as of the function.
       &quot;secret&quot;: &quot;A String&quot;, # Name of the secret in secret manager (not the full resource name).
       &quot;versions&quot;: [ # List of secret versions to mount for this secret. If empty, the `latest` version of the secret will be made available in a file named after the secret under the mount point.
         { # Configuration for a single version.
diff --git a/docs/dyn/content_v2_1.accounts.html b/docs/dyn/content_v2_1.accounts.html
index 86b8370..cee61c6 100644
--- a/docs/dyn/content_v2_1.accounts.html
+++ b/docs/dyn/content_v2_1.accounts.html
@@ -126,11 +126,17 @@
   <code><a href="#listlinks_next">listlinks_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="#requestphoneverification">requestphoneverification(merchantId, accountId, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Request verification code to start phone verification.</p>
+<p class="toc_element">
   <code><a href="#update">update(merchantId, accountId, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a Merchant Center account. Any fields that are not provided are deleted from the resource.</p>
 <p class="toc_element">
   <code><a href="#updatelabels">updatelabels(merchantId, accountId, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates labels that are assigned to the Merchant Center account by CSS user.</p>
+<p class="toc_element">
+  <code><a href="#verifyphonenumber">verifyphonenumber(merchantId, accountId, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Validates verification code to verify phone number for the account.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="authinfo">authinfo(x__xgafv=None)</code>
@@ -772,6 +778,36 @@
 </div>
 
 <div class="method">
+    <code class="details" id="requestphoneverification">requestphoneverification(merchantId, accountId, body=None, x__xgafv=None)</code>
+  <pre>Request verification code to start phone verification.
+
+Args:
+  merchantId: string, Required. The ID of the managing account. If this parameter is not the same as accountId, then this account must be a multi-client account and accountId must be the ID of a sub-account of this account. (required)
+  accountId: string, Required. The ID of the account. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for the RequestPhoneVerification method.
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language code [IETF BCP 47 syntax](https://tools.ietf.org/html/bcp47) (for example, en-US). Language code is used to provide localized `SMS` and `PHONE_CALL`. Default language used is en-US if not provided.
+  &quot;phoneNumber&quot;: &quot;A String&quot;, # Phone number to be verified.
+  &quot;phoneRegionCode&quot;: &quot;A String&quot;, # Required. Two letter country code for the phone number, for example `CA` for Canadian numbers. See the [ISO 3166-1 alpha-2](https://wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements) officially assigned codes.
+  &quot;phoneVerificationMethod&quot;: &quot;A String&quot;, # Verification method to receive verification code.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for the RequestPhoneVerification method.
+  &quot;verificationId&quot;: &quot;A String&quot;, # The verification ID to use in subsequent calls to `verifyphonenumber`.
+}</pre>
+</div>
+
+<div class="method">
     <code class="details" id="update">update(merchantId, accountId, body=None, x__xgafv=None)</code>
   <pre>Updates a Merchant Center account. Any fields that are not provided are deleted from the resource.
 
@@ -935,4 +971,33 @@
 }</pre>
 </div>
 
+<div class="method">
+    <code class="details" id="verifyphonenumber">verifyphonenumber(merchantId, accountId, body=None, x__xgafv=None)</code>
+  <pre>Validates verification code to verify phone number for the account.
+
+Args:
+  merchantId: string, Required. The ID of the managing account. If this parameter is not the same as accountId, then this account must be a multi-client account and accountId must be the ID of a sub-account of this account. (required)
+  accountId: string, Required. The ID of the account. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for the VerifyPhoneNumber method.
+  &quot;phoneVerificationMethod&quot;: &quot;A String&quot;, # Verification method used to receive verification code.
+  &quot;verificationCode&quot;: &quot;A String&quot;, # The verification code that was sent to the phone number for validation.
+  &quot;verificationId&quot;: &quot;A String&quot;, # The verification ID returned by `requestphoneverification`.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for the VerifyPhoneNumber method.
+  &quot;verifiedPhoneNumber&quot;: &quot;A String&quot;, # Verified phone number if verification is successful.
+}</pre>
+</div>
+
 </body></html>
\ No newline at end of file
diff --git a/docs/dyn/content_v2_1.freelistingsprogram.html b/docs/dyn/content_v2_1.freelistingsprogram.html
new file mode 100644
index 0000000..48fe4d6
--- /dev/null
+++ b/docs/dyn/content_v2_1.freelistingsprogram.html
@@ -0,0 +1,146 @@
+<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="content_v2_1.html">Content API for Shopping</a> . <a href="content_v2_1.freelistingsprogram.html">freelistingsprogram</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="#get">get(merchantId, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves the status and review eligibility for the free listing program.</p>
+<p class="toc_element">
+  <code><a href="#requestreview">requestreview(merchantId, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Requests a review for Free Listings program in the provided region. Important: This method is only whitelisted for selected merchants.</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="get">get(merchantId, x__xgafv=None)</code>
+  <pre>Retrieves the status and review eligibility for the free listing program.
+
+Args:
+  merchantId: string, Required. The ID of the account. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for GetFreeListingsProgramStatus.
+  &quot;regionStatuses&quot;: [ # Status of the program in each region. Regions with the same status and review eligibility are grouped together in `regionCodes`.
+    { # Status of program and region.
+      &quot;disapprovalDate&quot;: &quot;A String&quot;, # Date by which `eligibility_status` will go from `WARNING` to `DISAPPROVED`. It will be present when `eligibility_status` is `WARNING`. Date will be provided in ISO 8601 format i.e. YYYY-MM-DD
+      &quot;eligibilityStatus&quot;: &quot;A String&quot;, # Eligibility status of the standard free listing program.
+      &quot;enhancedEligibilityStatus&quot;: &quot;A String&quot;, # Eligibility status of the enhanced free listing program.
+      &quot;ineligibilityReason&quot;: &quot;A String&quot;, # Reason if a program in a given country is not eligible for review. Populated only if `review_eligibility_status` is `INELIGIBLE`.
+      &quot;regionCodes&quot;: [ # The two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) codes for all the regions with the same `eligibilityStatus` and `reviewEligibility`.
+        &quot;A String&quot;,
+      ],
+      &quot;reviewEligibilityStatus&quot;: &quot;A String&quot;, # If a program in a given country is eligible for review. It will be present only if eligibility status is `DISAPPROVED`.
+      &quot;reviewIssues&quot;: [ # These issues will be evaluated in review process. Fix all the issues before requesting the review.
+        &quot;A String&quot;,
+      ],
+    },
+  ],
+  &quot;state&quot;: &quot;A String&quot;, # If program is successfully onboarded for at least one region.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="requestreview">requestreview(merchantId, body=None, x__xgafv=None)</code>
+  <pre>Requests a review for Free Listings program in the provided region. Important: This method is only whitelisted for selected merchants.
+
+Args:
+  merchantId: string, Required. The ID of the account. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for the RequestReviewFreeListings Program method.
+  &quot;regionCode&quot;: &quot;A String&quot;, # The code [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the country for which review is to be requested.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/content_v2_1.html b/docs/dyn/content_v2_1.html
index 231fb1c..82c9b4f 100644
--- a/docs/dyn/content_v2_1.html
+++ b/docs/dyn/content_v2_1.html
@@ -120,6 +120,11 @@
 <p class="firstline">Returns the datafeedstatuses Resource.</p>
 
 <p class="toc_element">
+  <code><a href="content_v2_1.freelistingsprogram.html">freelistingsprogram()</a></code>
+</p>
+<p class="firstline">Returns the freelistingsprogram Resource.</p>
+
+<p class="toc_element">
   <code><a href="content_v2_1.liasettings.html">liasettings()</a></code>
 </p>
 <p class="firstline">Returns the liasettings Resource.</p>
@@ -225,6 +230,11 @@
 <p class="firstline">Returns the shippingsettings Resource.</p>
 
 <p class="toc_element">
+  <code><a href="content_v2_1.shoppingadsprogram.html">shoppingadsprogram()</a></code>
+</p>
+<p class="firstline">Returns the shoppingadsprogram 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">
diff --git a/docs/dyn/content_v2_1.reports.html b/docs/dyn/content_v2_1.reports.html
index 769ad21..81c4f67 100644
--- a/docs/dyn/content_v2_1.reports.html
+++ b/docs/dyn/content_v2_1.reports.html
@@ -101,7 +101,7 @@
 { # Request message for the ReportService.Search method.
   &quot;pageSize&quot;: 42, # Number of ReportRows to retrieve in a single page. Defaults to the maximum of 1000. Values above 1000 are coerced to 1000.
   &quot;pageToken&quot;: &quot;A String&quot;, # Token of the page to retrieve. If not specified, the first page of results is returned. In order to request the next page of results, the value obtained from `next_page_token` in the previous response should be used.
-  &quot;query&quot;: &quot;A String&quot;, # Required. Query that defines performance metrics to retrieve and dimensions according to which the metrics are to be segmented.
+  &quot;query&quot;: &quot;A String&quot;, # Required. Query that defines performance metrics to retrieve and dimensions according to which the metrics are to be segmented. For details on how to construct your query, see the [Query Language guide](https://developers.google.com/shopping-content/guides/reports/query-language/overview).
 }
 
   x__xgafv: string, V1 error format.
@@ -140,11 +140,11 @@
       },
       &quot;segments&quot;: { # Dimensions according to which metrics are segmented in the response. Values of product dimensions, e.g., offer id, reflect the state of a product at the time of the corresponding event, e.g., impression or order. Segment fields cannot be selected in queries without also selecting at least one metric field. Values are only set for dimensions requested explicitly in the request&#x27;s search query. # Segmentation dimensions requested by the merchant in the query. Dimension values are only set for dimensions requested explicitly in the query.
         &quot;brand&quot;: &quot;A String&quot;, # Brand of the product.
-        &quot;categoryL1&quot;: &quot;A String&quot;, # Product category (1st level) in Google&#x27;s product taxonomy.
-        &quot;categoryL2&quot;: &quot;A String&quot;, # Product category (2nd level) in Google&#x27;s product taxonomy.
-        &quot;categoryL3&quot;: &quot;A String&quot;, # Product category (3rd level) in Google&#x27;s product taxonomy.
-        &quot;categoryL4&quot;: &quot;A String&quot;, # Product category (4th level) in Google&#x27;s product taxonomy.
-        &quot;categoryL5&quot;: &quot;A String&quot;, # Product category (5th level) in Google&#x27;s product taxonomy.
+        &quot;categoryL1&quot;: &quot;A String&quot;, # [Product category (1st level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google&#x27;s product taxonomy.
+        &quot;categoryL2&quot;: &quot;A String&quot;, # [Product category (2nd level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google&#x27;s product taxonomy.
+        &quot;categoryL3&quot;: &quot;A String&quot;, # [Product category (3rd level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google&#x27;s product taxonomy.
+        &quot;categoryL4&quot;: &quot;A String&quot;, # [Product category (4th level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google&#x27;s product taxonomy.
+        &quot;categoryL5&quot;: &quot;A String&quot;, # [Product category (5th level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google&#x27;s product taxonomy.
         &quot;currencyCode&quot;: &quot;A String&quot;, # Currency in which price metrics are represented, e.g., if you select `ordered_item_sales_micros`, the returned value will be represented by this currency.
         &quot;customLabel0&quot;: &quot;A String&quot;, # Custom label 0 for custom grouping of products.
         &quot;customLabel1&quot;: &quot;A String&quot;, # Custom label 1 for custom grouping of products.
@@ -157,11 +157,11 @@
           &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
         },
         &quot;offerId&quot;: &quot;A String&quot;, # Merchant-provided id of the product.
-        &quot;productTypeL1&quot;: &quot;A String&quot;, # Product category (1st level) in merchant&#x27;s own product taxonomy.
-        &quot;productTypeL2&quot;: &quot;A String&quot;, # Product category (2nd level) in merchant&#x27;s own product taxonomy.
-        &quot;productTypeL3&quot;: &quot;A String&quot;, # Product category (3rd level) in merchant&#x27;s own product taxonomy.
-        &quot;productTypeL4&quot;: &quot;A String&quot;, # Product category (4th level) in merchant&#x27;s own product taxonomy.
-        &quot;productTypeL5&quot;: &quot;A String&quot;, # Product category (5th level) in merchant&#x27;s own product taxonomy.
+        &quot;productTypeL1&quot;: &quot;A String&quot;, # [Product type (1st level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant&#x27;s own product taxonomy.
+        &quot;productTypeL2&quot;: &quot;A String&quot;, # [Product type (2nd level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant&#x27;s own product taxonomy.
+        &quot;productTypeL3&quot;: &quot;A String&quot;, # [Product type (3rd level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant&#x27;s own product taxonomy.
+        &quot;productTypeL4&quot;: &quot;A String&quot;, # [Product type (4th level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant&#x27;s own product taxonomy.
+        &quot;productTypeL5&quot;: &quot;A String&quot;, # [Product type (5th level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant&#x27;s own product taxonomy.
         &quot;program&quot;: &quot;A String&quot;, # Program to which metrics apply, e.g., Free Product Listing.
         &quot;title&quot;: &quot;A String&quot;, # Title of the product.
         &quot;week&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # First day of the week (Monday) of the metrics date in the merchant timezone.
diff --git a/docs/dyn/content_v2_1.shoppingadsprogram.html b/docs/dyn/content_v2_1.shoppingadsprogram.html
new file mode 100644
index 0000000..4d7eb62
--- /dev/null
+++ b/docs/dyn/content_v2_1.shoppingadsprogram.html
@@ -0,0 +1,145 @@
+<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="content_v2_1.html">Content API for Shopping</a> . <a href="content_v2_1.shoppingadsprogram.html">shoppingadsprogram</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="#get">get(merchantId, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves the status and review eligibility for the Shopping Ads program.</p>
+<p class="toc_element">
+  <code><a href="#requestreview">requestreview(merchantId, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Requests a review for Shopping Ads program in the provided country.</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="get">get(merchantId, x__xgafv=None)</code>
+  <pre>Retrieves the status and review eligibility for the Shopping Ads program.
+
+Args:
+  merchantId: string, Required. The ID of the account. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for GetShoppingAdsProgramStatus.
+  &quot;regionStatuses&quot;: [ # Status of the program in each region. Regions with the same status and review eligibility are grouped together in `regionCodes`.
+    { # Status of program and region.
+      &quot;disapprovalDate&quot;: &quot;A String&quot;, # Date by which `eligibility_status` will go from `WARNING` to `DISAPPROVED`. It will be present when `eligibility_status` is `WARNING`. Date will be provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format i.e. YYYY-MM-DD
+      &quot;eligibilityStatus&quot;: &quot;A String&quot;, # Eligibility status of the Shopping Ads program.
+      &quot;ineligibilityReason&quot;: &quot;A String&quot;, # Reason if a program in a given country is not eligible for review. Populated only if `review_eligibility_status` is `INELIGIBLE`.
+      &quot;regionCodes&quot;: [ # The two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) codes for all the regions with the same `eligibilityStatus` and `reviewEligibility`.
+        &quot;A String&quot;,
+      ],
+      &quot;reviewEligibilityStatus&quot;: &quot;A String&quot;, # If a program in a given country is eligible for review. It will be present only if eligibility status is `DISAPPROVED`.
+      &quot;reviewIssues&quot;: [ # These issues will be evaluated in review process. Fix all the issues before requesting the review.
+        &quot;A String&quot;,
+      ],
+    },
+  ],
+  &quot;state&quot;: &quot;A String&quot;, # If program is successfully onboarded for at least one region.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="requestreview">requestreview(merchantId, body=None, x__xgafv=None)</code>
+  <pre>Requests a review for Shopping Ads program in the provided country.
+
+Args:
+  merchantId: string, Required. The ID of the account. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for the RequestReviewShoppingAds program method.
+  &quot;regionCode&quot;: &quot;A String&quot;, # The code [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the country for which review is to be requested.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/datastore_v1.projects.html b/docs/dyn/datastore_v1.projects.html
index 4f71a3f..96acf9c 100644
--- a/docs/dyn/datastore_v1.projects.html
+++ b/docs/dyn/datastore_v1.projects.html
@@ -248,7 +248,40 @@
           ],
         },
         &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-          &quot;a_key&quot;: # Object with schema name: Value
+          &quot;a_key&quot;: { # A message that can hold any of the supported value types and associated metadata.
+            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot contain another array value. A `Value` instance that sets field `array_value` must not set fields `meaning` or `exclude_from_indexes`.
+              &quot;values&quot;: [ # Values in the array. The order of values in an array is preserved as long as all values have identical settings for &#x27;exclude_from_indexes&#x27;.
+                # Object with schema name: Value
+              ],
+            },
+            &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
+            &quot;booleanValue&quot;: True or False, # A boolean value.
+            &quot;doubleValue&quot;: 3.14, # A double value.
+            &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
+            &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
+            &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+              &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+              &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+            },
+            &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+            &quot;keyValue&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # A key value.
+              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
+                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
+                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
+              },
+              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
+                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
+                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
+                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                },
+              ],
+            },
+            &quot;meaning&quot;: 42, # The `meaning` field should only be populated for backwards compatibility.
+            &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+            &quot;stringValue&quot;: &quot;A String&quot;, # A UTF-8 encoded string value. When `exclude_from_indexes` is false (it is indexed) , may have at most 1500 bytes. Otherwise, may be set to at most 1,000,000 bytes.
+            &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. When stored in the Datastore, precise only to microseconds; any additional precision is rounded down.
+          },
         },
       },
       &quot;update&quot;: { # A Datastore data object. An entity is limited to 1 megabyte when stored. That _roughly_ corresponds to a limit of 1 megabyte for the serialized form of this message. # The entity to update. The entity must already exist. Must have a complete key path.
@@ -266,7 +299,40 @@
           ],
         },
         &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-          &quot;a_key&quot;: # Object with schema name: Value
+          &quot;a_key&quot;: { # A message that can hold any of the supported value types and associated metadata.
+            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot contain another array value. A `Value` instance that sets field `array_value` must not set fields `meaning` or `exclude_from_indexes`.
+              &quot;values&quot;: [ # Values in the array. The order of values in an array is preserved as long as all values have identical settings for &#x27;exclude_from_indexes&#x27;.
+                # Object with schema name: Value
+              ],
+            },
+            &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
+            &quot;booleanValue&quot;: True or False, # A boolean value.
+            &quot;doubleValue&quot;: 3.14, # A double value.
+            &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
+            &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
+            &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+              &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+              &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+            },
+            &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+            &quot;keyValue&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # A key value.
+              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
+                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
+                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
+              },
+              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
+                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
+                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
+                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                },
+              ],
+            },
+            &quot;meaning&quot;: 42, # The `meaning` field should only be populated for backwards compatibility.
+            &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+            &quot;stringValue&quot;: &quot;A String&quot;, # A UTF-8 encoded string value. When `exclude_from_indexes` is false (it is indexed) , may have at most 1500 bytes. Otherwise, may be set to at most 1,000,000 bytes.
+            &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. When stored in the Datastore, precise only to microseconds; any additional precision is rounded down.
+          },
         },
       },
       &quot;upsert&quot;: { # A Datastore data object. An entity is limited to 1 megabyte when stored. That _roughly_ corresponds to a limit of 1 megabyte for the serialized form of this message. # The entity to upsert. The entity may or may not already exist. The entity key&#x27;s final path element may be incomplete.
@@ -284,7 +350,40 @@
           ],
         },
         &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-          &quot;a_key&quot;: # Object with schema name: Value
+          &quot;a_key&quot;: { # A message that can hold any of the supported value types and associated metadata.
+            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot contain another array value. A `Value` instance that sets field `array_value` must not set fields `meaning` or `exclude_from_indexes`.
+              &quot;values&quot;: [ # Values in the array. The order of values in an array is preserved as long as all values have identical settings for &#x27;exclude_from_indexes&#x27;.
+                # Object with schema name: Value
+              ],
+            },
+            &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
+            &quot;booleanValue&quot;: True or False, # A boolean value.
+            &quot;doubleValue&quot;: 3.14, # A double value.
+            &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
+            &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
+            &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+              &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+              &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+            },
+            &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+            &quot;keyValue&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # A key value.
+              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
+                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
+                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
+              },
+              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
+                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
+                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
+                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                },
+              ],
+            },
+            &quot;meaning&quot;: 42, # The `meaning` field should only be populated for backwards compatibility.
+            &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+            &quot;stringValue&quot;: &quot;A String&quot;, # A UTF-8 encoded string value. When `exclude_from_indexes` is false (it is indexed) , may have at most 1500 bytes. Otherwise, may be set to at most 1,000,000 bytes.
+            &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. When stored in the Datastore, precise only to microseconds; any additional precision is rounded down.
+          },
         },
       },
     },
@@ -503,7 +602,40 @@
           ],
         },
         &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-          &quot;a_key&quot;: # Object with schema name: Value
+          &quot;a_key&quot;: { # A message that can hold any of the supported value types and associated metadata.
+            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot contain another array value. A `Value` instance that sets field `array_value` must not set fields `meaning` or `exclude_from_indexes`.
+              &quot;values&quot;: [ # Values in the array. The order of values in an array is preserved as long as all values have identical settings for &#x27;exclude_from_indexes&#x27;.
+                # Object with schema name: Value
+              ],
+            },
+            &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
+            &quot;booleanValue&quot;: True or False, # A boolean value.
+            &quot;doubleValue&quot;: 3.14, # A double value.
+            &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
+            &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
+            &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+              &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+              &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+            },
+            &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+            &quot;keyValue&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # A key value.
+              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
+                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
+                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
+              },
+              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
+                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
+                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
+                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                },
+              ],
+            },
+            &quot;meaning&quot;: 42, # The `meaning` field should only be populated for backwards compatibility.
+            &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+            &quot;stringValue&quot;: &quot;A String&quot;, # A UTF-8 encoded string value. When `exclude_from_indexes` is false (it is indexed) , may have at most 1500 bytes. Otherwise, may be set to at most 1,000,000 bytes.
+            &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. When stored in the Datastore, precise only to microseconds; any additional precision is rounded down.
+          },
         },
       },
       &quot;version&quot;: &quot;A String&quot;, # The version of the entity, a strictly positive number that monotonically increases with changes to the entity. This field is set for `FULL` entity results. For missing entities in `LookupResponse`, this is the version of the snapshot that was used to look up the entity, and it is always set except for eventually consistent reads.
@@ -527,7 +659,40 @@
           ],
         },
         &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-          &quot;a_key&quot;: # Object with schema name: Value
+          &quot;a_key&quot;: { # A message that can hold any of the supported value types and associated metadata.
+            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot contain another array value. A `Value` instance that sets field `array_value` must not set fields `meaning` or `exclude_from_indexes`.
+              &quot;values&quot;: [ # Values in the array. The order of values in an array is preserved as long as all values have identical settings for &#x27;exclude_from_indexes&#x27;.
+                # Object with schema name: Value
+              ],
+            },
+            &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
+            &quot;booleanValue&quot;: True or False, # A boolean value.
+            &quot;doubleValue&quot;: 3.14, # A double value.
+            &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
+            &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
+            &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+              &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+              &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+            },
+            &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+            &quot;keyValue&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # A key value.
+              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
+                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
+                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
+              },
+              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
+                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
+                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
+                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                },
+              ],
+            },
+            &quot;meaning&quot;: 42, # The `meaning` field should only be populated for backwards compatibility.
+            &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+            &quot;stringValue&quot;: &quot;A String&quot;, # A UTF-8 encoded string value. When `exclude_from_indexes` is false (it is indexed) , may have at most 1500 bytes. Otherwise, may be set to at most 1,000,000 bytes.
+            &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. When stored in the Datastore, precise only to microseconds; any additional precision is rounded down.
+          },
         },
       },
       &quot;version&quot;: &quot;A String&quot;, # The version of the entity, a strictly positive number that monotonically increases with changes to the entity. This field is set for `FULL` entity results. For missing entities in `LookupResponse`, this is the version of the snapshot that was used to look up the entity, and it is always set except for eventually consistent reads.
@@ -625,24 +790,7 @@
           &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;doubleValue&quot;: 3.14, # A double value.
-          &quot;entityValue&quot;: { # A Datastore data object. An entity is limited to 1 megabyte when stored. That _roughly_ corresponds to a limit of 1 megabyte for the serialized form of this message. # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
-            &quot;key&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # The entity&#x27;s key. An entity must have a key, unless otherwise documented (for example, an entity in `Value.entity_value` may have no key). An entity&#x27;s kind is its key path&#x27;s last element&#x27;s kind, or null if it has no key.
-              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
-                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
-                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
-              },
-              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
-                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
-                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
-                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
-                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
-                },
-              ],
-            },
-            &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-              &quot;a_key&quot;: # Object with schema name: Value
-            },
-          },
+          &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
           &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
           &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
             &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
@@ -681,24 +829,7 @@
           &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;doubleValue&quot;: 3.14, # A double value.
-          &quot;entityValue&quot;: { # A Datastore data object. An entity is limited to 1 megabyte when stored. That _roughly_ corresponds to a limit of 1 megabyte for the serialized form of this message. # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
-            &quot;key&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # The entity&#x27;s key. An entity must have a key, unless otherwise documented (for example, an entity in `Value.entity_value` may have no key). An entity&#x27;s kind is its key path&#x27;s last element&#x27;s kind, or null if it has no key.
-              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
-                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
-                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
-              },
-              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
-                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
-                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
-                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
-                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
-                },
-              ],
-            },
-            &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-              &quot;a_key&quot;: # Object with schema name: Value
-            },
-          },
+          &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
           &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
           &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
             &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
@@ -759,24 +890,7 @@
           &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;doubleValue&quot;: 3.14, # A double value.
-          &quot;entityValue&quot;: { # A Datastore data object. An entity is limited to 1 megabyte when stored. That _roughly_ corresponds to a limit of 1 megabyte for the serialized form of this message. # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
-            &quot;key&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # The entity&#x27;s key. An entity must have a key, unless otherwise documented (for example, an entity in `Value.entity_value` may have no key). An entity&#x27;s kind is its key path&#x27;s last element&#x27;s kind, or null if it has no key.
-              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
-                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
-                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
-              },
-              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
-                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
-                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
-                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
-                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
-                },
-              ],
-            },
-            &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-              &quot;a_key&quot;: # Object with schema name: Value
-            },
-          },
+          &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
           &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
           &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
             &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
@@ -863,7 +977,40 @@
             ],
           },
           &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-            &quot;a_key&quot;: # Object with schema name: Value
+            &quot;a_key&quot;: { # A message that can hold any of the supported value types and associated metadata.
+              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot contain another array value. A `Value` instance that sets field `array_value` must not set fields `meaning` or `exclude_from_indexes`.
+                &quot;values&quot;: [ # Values in the array. The order of values in an array is preserved as long as all values have identical settings for &#x27;exclude_from_indexes&#x27;.
+                  # Object with schema name: Value
+                ],
+              },
+              &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
+              &quot;booleanValue&quot;: True or False, # A boolean value.
+              &quot;doubleValue&quot;: 3.14, # A double value.
+              &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
+              &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
+              &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+              },
+              &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+              &quot;keyValue&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # A key value.
+                &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
+                  &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
+                  &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
+                },
+                &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
+                  { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
+                    &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
+                    &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                    &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
+                  },
+                ],
+              },
+              &quot;meaning&quot;: 42, # The `meaning` field should only be populated for backwards compatibility.
+              &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+              &quot;stringValue&quot;: &quot;A String&quot;, # A UTF-8 encoded string value. When `exclude_from_indexes` is false (it is indexed) , may have at most 1500 bytes. Otherwise, may be set to at most 1,000,000 bytes.
+              &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. When stored in the Datastore, precise only to microseconds; any additional precision is rounded down.
+            },
           },
         },
         &quot;version&quot;: &quot;A String&quot;, # The version of the entity, a strictly positive number that monotonically increases with changes to the entity. This field is set for `FULL` entity results. For missing entities in `LookupResponse`, this is the version of the snapshot that was used to look up the entity, and it is always set except for eventually consistent reads.
@@ -902,24 +1049,7 @@
           &quot;blobValue&quot;: &quot;A String&quot;, # A blob value. May have at most 1,000,000 bytes. When `exclude_from_indexes` is false, may have at most 1500 bytes. In JSON requests, must be base64-encoded.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;doubleValue&quot;: 3.14, # A double value.
-          &quot;entityValue&quot;: { # A Datastore data object. An entity is limited to 1 megabyte when stored. That _roughly_ corresponds to a limit of 1 megabyte for the serialized form of this message. # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
-            &quot;key&quot;: { # A unique identifier for an entity. If a key&#x27;s partition ID or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts. # The entity&#x27;s key. An entity must have a key, unless otherwise documented (for example, an entity in `Value.entity_value` may have no key). An entity&#x27;s kind is its key path&#x27;s last element&#x27;s kind, or null if it has no key.
-              &quot;partitionId&quot;: { # A partition ID identifies a grouping of entities. The grouping is always by project and namespace, however the namespace ID may be empty. A partition ID contains several dimensions: project ID and namespace ID. Partition dimensions: - May be `&quot;&quot;`. - Must be valid UTF-8 bytes. - Must have values that match regex `[A-Za-z\d\.\-_]{1,100}` If the value of any dimension matches regex `__.*__`, the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts. Foreign partition IDs (in which the project ID does not match the context project ID ) are discouraged. Reads and writes of foreign partition IDs may fail if the project is not in an active state. # Entities are partitioned into subsets, currently identified by a project ID and namespace ID. Queries are scoped to a single partition.
-                &quot;namespaceId&quot;: &quot;A String&quot;, # If not empty, the ID of the namespace to which the entities belong.
-                &quot;projectId&quot;: &quot;A String&quot;, # The ID of the project to which the entities belong.
-              },
-              &quot;path&quot;: [ # The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a _root entity_, the second element identifies a _child_ of the root entity, the third element identifies a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element&#x27;s _ancestors_. An entity path is always fully complete: *all* of the entity&#x27;s ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. For example, the last path element of the key of `Mutation.insert` may have no identifier. A path can never be empty, and a path can have at most 100 elements.
-                { # A (kind, ID/name) pair used to construct a key path. If either name or ID is set, the element is complete. If neither is set, the element is incomplete.
-                  &quot;id&quot;: &quot;A String&quot;, # The auto-allocated ID of the entity. Never equal to zero. Values less than zero are discouraged and may not be supported in the future.
-                  &quot;kind&quot;: &quot;A String&quot;, # The kind of the entity. A kind matching regex `__.*__` is reserved/read-only. A kind must not contain more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
-                  &quot;name&quot;: &quot;A String&quot;, # The name of the entity. A name matching regex `__.*__` is reserved/read-only. A name must not be more than 1500 bytes when UTF-8 encoded. Cannot be `&quot;&quot;`.
-                },
-              ],
-            },
-            &quot;properties&quot;: { # The entity&#x27;s properties. The map&#x27;s keys are property names. A property name matching regex `__.*__` is reserved. A reserved property name is forbidden in certain documented contexts. The name must not contain more than 500 characters. The name cannot be `&quot;&quot;`.
-              &quot;a_key&quot;: # Object with schema name: Value
-            },
-          },
+          &quot;entityValue&quot;: # Object with schema name: Entity # An entity value. - May have no key. - May have a key with an incomplete key path. - May have a reserved/read-only key.
           &quot;excludeFromIndexes&quot;: True or False, # If the value should be excluded from all indexes including those defined explicitly.
           &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
             &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
diff --git a/docs/dyn/displayvideo_v1.advertisers.campaigns.html b/docs/dyn/displayvideo_v1.advertisers.campaigns.html
index 404913e..50adcd9 100644
--- a/docs/dyn/displayvideo_v1.advertisers.campaigns.html
+++ b/docs/dyn/displayvideo_v1.advertisers.campaigns.html
@@ -202,6 +202,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -290,6 +296,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -304,6 +314,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.advertisers.campaigns.targetingTypes.assignedTargetingOptions.html b/docs/dyn/displayvideo_v1.advertisers.campaigns.targetingTypes.assignedTargetingOptions.html
index 9a97a86..78e7e9c 100644
--- a/docs/dyn/displayvideo_v1.advertisers.campaigns.targetingTypes.assignedTargetingOptions.html
+++ b/docs/dyn/displayvideo_v1.advertisers.campaigns.targetingTypes.assignedTargetingOptions.html
@@ -139,7 +139,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   assignedTargetingOptionId: string, Required. An identifier unique to the targeting type in this campaign that identifies the assigned targeting option being requested. (required)
   x__xgafv: string, V1 error format.
     Allowed values
@@ -223,6 +226,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -311,6 +320,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -325,6 +338,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -464,7 +485,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   filter: string, Allows filtering by assigned targeting option properties. Supported syntax: * Filter expressions are made up of one or more restrictions. * Restrictions can be combined by the logical operator `OR`. * A restriction has the form of `{field} {operator} {value}`. * The operator must be `EQUALS (=)`. * Supported fields: - `assignedTargetingOptionId` - `inheritance` Examples: * AssignedTargetingOptions with ID 1 or 2 `assignedTargetingOptionId=&quot;1&quot; OR assignedTargetingOptionId=&quot;2&quot;` * AssignedTargetingOptions with inheritance status of NOT_INHERITED or INHERITED_FROM_PARTNER `inheritance=&quot;NOT_INHERITED&quot; OR inheritance=&quot;INHERITED_FROM_PARTNER&quot;` The length of this field should be no more than 500 characters.
   orderBy: string, Field by which to sort the list. Acceptable values are: * `assignedTargetingOptionId` (default) The default sorting order is ascending. To specify descending order for a field, a suffix &quot;desc&quot; should be added to the field name. Example: `assignedTargetingOptionId desc`.
   pageSize: integer, Requested page size. Must be between `1` and `5000`. If unspecified will default to `100`. Returns error code `INVALID_ARGUMENT` if an invalid value is specified.
@@ -553,6 +577,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -641,6 +671,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -655,6 +689,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.advertisers.html b/docs/dyn/displayvideo_v1.advertisers.html
index f1a6847..7008b73 100644
--- a/docs/dyn/displayvideo_v1.advertisers.html
+++ b/docs/dyn/displayvideo_v1.advertisers.html
@@ -200,7 +200,7 @@
     The object takes the form of:
 
 { # Request message for BulkEditAdvertiserAssignedTargetingOptions.
-  &quot;createRequests&quot;: [ # The assigned targeting options to create in batch, specified as a list of `CreateAssignedTargetingOptionsRequest`. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`
+  &quot;createRequests&quot;: [ # The assigned targeting options to create in batch, specified as a list of `CreateAssignedTargetingOptionsRequest`. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`
     { # A request listing which assigned targeting options of a given targeting type should be created and added.
       &quot;assignedTargetingOptions&quot;: [ # Required. The assigned targeting options to create and add.
         { # A single assigned targeting option, which defines the state of a targeting option for an entity with targeting settings.
@@ -277,6 +277,12 @@
             &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
             &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
           },
+          &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+            &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+            &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+            &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+          },
           &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
             &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
             &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -365,6 +371,10 @@
           &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
             &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
           },
+          &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+            &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+          },
           &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
             &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
             &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -379,6 +389,14 @@
             &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
             &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
           },
+          &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+            &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+            &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+            &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+            &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+            &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+          },
           &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
             &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
             &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -473,7 +491,7 @@
       &quot;targetingType&quot;: &quot;A String&quot;, # Required. Identifies the type of this assigned targeting option.
     },
   ],
-  &quot;deleteRequests&quot;: [ # The assigned targeting options to delete in batch, specified as a list of `DeleteAssignedTargetingOptionsRequest`. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`
+  &quot;deleteRequests&quot;: [ # The assigned targeting options to delete in batch, specified as a list of `DeleteAssignedTargetingOptionsRequest`. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`
     { # A request listing which assigned targeting options of a given targeting type should be deleted.
       &quot;assignedTargetingOptionIds&quot;: [ # Required. The assigned targeting option IDs to delete.
         &quot;A String&quot;,
@@ -567,6 +585,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -655,6 +679,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -669,6 +697,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -857,6 +893,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -945,6 +987,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -959,6 +1005,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.advertisers.insertionOrders.html b/docs/dyn/displayvideo_v1.advertisers.insertionOrders.html
index eff5006..ffdefa5 100644
--- a/docs/dyn/displayvideo_v1.advertisers.insertionOrders.html
+++ b/docs/dyn/displayvideo_v1.advertisers.insertionOrders.html
@@ -202,6 +202,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -290,6 +296,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -304,6 +314,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.html b/docs/dyn/displayvideo_v1.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.html
index 5b1ce80..36cd591 100644
--- a/docs/dyn/displayvideo_v1.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.html
+++ b/docs/dyn/displayvideo_v1.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.html
@@ -139,7 +139,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   assignedTargetingOptionId: string, Required. An identifier unique to the targeting type in this insertion order that identifies the assigned targeting option being requested. (required)
   x__xgafv: string, V1 error format.
     Allowed values
@@ -223,6 +226,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -311,6 +320,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -325,6 +338,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -464,7 +485,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   filter: string, Allows filtering by assigned targeting option properties. Supported syntax: * Filter expressions are made up of one or more restrictions. * Restrictions can be combined by the logical operator `OR`. * A restriction has the form of `{field} {operator} {value}`. * The operator must be `EQUALS (=)`. * Supported fields: - `assignedTargetingOptionId` - `inheritance` Examples: * AssignedTargetingOptions with ID 1 or 2 `assignedTargetingOptionId=&quot;1&quot; OR assignedTargetingOptionId=&quot;2&quot;` * AssignedTargetingOptions with inheritance status of NOT_INHERITED or INHERITED_FROM_PARTNER `inheritance=&quot;NOT_INHERITED&quot; OR inheritance=&quot;INHERITED_FROM_PARTNER&quot;` The length of this field should be no more than 500 characters.
   orderBy: string, Field by which to sort the list. Acceptable values are: * `assignedTargetingOptionId` (default) The default sorting order is ascending. To specify descending order for a field, a suffix &quot;desc&quot; should be added to the field name. Example: `assignedTargetingOptionId desc`.
   pageSize: integer, Requested page size. Must be between `1` and `5000`. If unspecified will default to `100`. Returns error code `INVALID_ARGUMENT` if an invalid value is specified.
@@ -553,6 +577,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -641,6 +671,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -655,6 +689,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.advertisers.lineItems.html b/docs/dyn/displayvideo_v1.advertisers.lineItems.html
index 6ffb254..06b3e04 100644
--- a/docs/dyn/displayvideo_v1.advertisers.lineItems.html
+++ b/docs/dyn/displayvideo_v1.advertisers.lineItems.html
@@ -201,6 +201,12 @@
             &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
             &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
           },
+          &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+            &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+            &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+            &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+          },
           &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
             &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
             &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -289,6 +295,10 @@
           &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
             &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
           },
+          &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+            &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+          },
           &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
             &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
             &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -303,6 +313,14 @@
             &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
             &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
           },
+          &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+            &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+            &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+            &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+            &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+            &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+          },
           &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
             &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
             &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -491,6 +509,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -579,6 +603,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -593,6 +621,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -782,6 +818,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -870,6 +912,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -884,6 +930,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.advertisers.lineItems.targetingTypes.assignedTargetingOptions.html b/docs/dyn/displayvideo_v1.advertisers.lineItems.targetingTypes.assignedTargetingOptions.html
index 0b5365d..4ca9a6a 100644
--- a/docs/dyn/displayvideo_v1.advertisers.lineItems.targetingTypes.assignedTargetingOptions.html
+++ b/docs/dyn/displayvideo_v1.advertisers.lineItems.targetingTypes.assignedTargetingOptions.html
@@ -145,7 +145,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   body: object, The request body.
     The object takes the form of:
 
@@ -223,6 +226,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -311,6 +320,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -325,6 +338,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -498,6 +519,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -586,6 +613,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -600,6 +631,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -739,7 +778,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   assignedTargetingOptionId: string, Required. The ID of the assigned targeting option to delete. (required)
   x__xgafv: string, V1 error format.
     Allowed values
@@ -800,7 +842,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   assignedTargetingOptionId: string, Required. An identifier unique to the targeting type in this line item that identifies the assigned targeting option being requested. (required)
   x__xgafv: string, V1 error format.
     Allowed values
@@ -884,6 +929,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -972,6 +1023,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -986,6 +1041,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -1125,7 +1188,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   filter: string, Allows filtering by assigned targeting option properties. Supported syntax: * Filter expressions are made up of one or more restrictions. * Restrictions can be combined by the logical operator `OR`. * A restriction has the form of `{field} {operator} {value}`. * The operator must be `EQUALS (=)`. * Supported fields: - `assignedTargetingOptionId` - `inheritance` Examples: * AssignedTargetingOptions with ID 1 or 2 `assignedTargetingOptionId=&quot;1&quot; OR assignedTargetingOptionId=&quot;2&quot;` * AssignedTargetingOptions with inheritance status of NOT_INHERITED or INHERITED_FROM_PARTNER `inheritance=&quot;NOT_INHERITED&quot; OR inheritance=&quot;INHERITED_FROM_PARTNER&quot;` The length of this field should be no more than 500 characters.
   orderBy: string, Field by which to sort the list. Acceptable values are: * `assignedTargetingOptionId` (default) The default sorting order is ascending. To specify descending order for a field, a suffix &quot;desc&quot; should be added to the field name. Example: `assignedTargetingOptionId desc`.
   pageSize: integer, Requested page size. Must be between `1` and `5000`. If unspecified will default to `100`. Returns error code `INVALID_ARGUMENT` if an invalid value is specified.
@@ -1214,6 +1280,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -1302,6 +1374,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -1316,6 +1392,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.advertisers.targetingTypes.assignedTargetingOptions.html b/docs/dyn/displayvideo_v1.advertisers.targetingTypes.assignedTargetingOptions.html
index 2815d6f..dfdc90c 100644
--- a/docs/dyn/displayvideo_v1.advertisers.targetingTypes.assignedTargetingOptions.html
+++ b/docs/dyn/displayvideo_v1.advertisers.targetingTypes.assignedTargetingOptions.html
@@ -104,7 +104,7 @@
 
 Args:
   advertiserId: string, Required. The ID of the advertiser. (required)
-  targetingType: string, Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION` (required)
+  targetingType: string, Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION` (required)
     Allowed values
       TARGETING_TYPE_UNSPECIFIED - Default value when type is not specified or is unknown in this version.
       TARGETING_TYPE_CHANNEL - Target a channel (a custom group of related websites or apps).
@@ -144,7 +144,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   body: object, The request body.
     The object takes the form of:
 
@@ -222,6 +225,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -310,6 +319,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -324,6 +337,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -497,6 +518,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -585,6 +612,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -599,6 +630,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -697,7 +736,7 @@
 
 Args:
   advertiserId: string, Required. The ID of the advertiser. (required)
-  targetingType: string, Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION` (required)
+  targetingType: string, Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION` (required)
     Allowed values
       TARGETING_TYPE_UNSPECIFIED - Default value when type is not specified or is unknown in this version.
       TARGETING_TYPE_CHANNEL - Target a channel (a custom group of related websites or apps).
@@ -737,7 +776,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   assignedTargetingOptionId: string, Required. The ID of the assigned targeting option to delete. (required)
   x__xgafv: string, V1 error format.
     Allowed values
@@ -757,7 +799,7 @@
 
 Args:
   advertiserId: string, Required. The ID of the advertiser. (required)
-  targetingType: string, Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION` (required)
+  targetingType: string, Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION` (required)
     Allowed values
       TARGETING_TYPE_UNSPECIFIED - Default value when type is not specified or is unknown in this version.
       TARGETING_TYPE_CHANNEL - Target a channel (a custom group of related websites or apps).
@@ -797,7 +839,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   assignedTargetingOptionId: string, Required. An identifier unique to the targeting type in this advertiser that identifies the assigned targeting option being requested. (required)
   x__xgafv: string, V1 error format.
     Allowed values
@@ -881,6 +926,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -969,6 +1020,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -983,6 +1038,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -1081,7 +1144,7 @@
 
 Args:
   advertiserId: string, Required. The ID of the advertiser. (required)
-  targetingType: string, Required. Identifies the type of assigned targeting options to list. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION` (required)
+  targetingType: string, Required. Identifies the type of assigned targeting options to list. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION` (required)
     Allowed values
       TARGETING_TYPE_UNSPECIFIED - Default value when type is not specified or is unknown in this version.
       TARGETING_TYPE_CHANNEL - Target a channel (a custom group of related websites or apps).
@@ -1121,7 +1184,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   filter: string, Allows filtering by assigned targeting option properties. Supported syntax: * Filter expressions are made up of one or more restrictions. * Restrictions can be combined by the logical operator `OR`. * A restriction has the form of `{field} {operator} {value}`. * The operator must be `EQUALS (=)`. * Supported fields: - `assignedTargetingOptionId` Examples: * AssignedTargetingOption with ID 123456 `assignedTargetingOptionId=&quot;123456&quot;` The length of this field should be no more than 500 characters.
   orderBy: string, Field by which to sort the list. Acceptable values are: * `assignedTargetingOptionId` (default) The default sorting order is ascending. To specify descending order for a field, a suffix &quot;desc&quot; should be added to the field name. Example: `assignedTargetingOptionId desc`.
   pageSize: integer, Requested page size. Must be between `1` and `5000`. If unspecified will default to `100`. Returns error code `INVALID_ARGUMENT` if an invalid value is specified.
@@ -1210,6 +1276,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -1298,6 +1370,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -1312,6 +1388,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.partners.html b/docs/dyn/displayvideo_v1.partners.html
index 2d5a65f..ef31037 100644
--- a/docs/dyn/displayvideo_v1.partners.html
+++ b/docs/dyn/displayvideo_v1.partners.html
@@ -187,6 +187,12 @@
             &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
             &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
           },
+          &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+            &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+            &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+            &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+          },
           &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
             &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
             &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -275,6 +281,10 @@
           &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
             &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
           },
+          &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+            &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+          },
           &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
             &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
             &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -289,6 +299,14 @@
             &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
             &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
           },
+          &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+            &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+            &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+            &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+            &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+            &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+            &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+          },
           &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
             &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
             &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -477,6 +495,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -565,6 +589,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -579,6 +607,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.partners.targetingTypes.assignedTargetingOptions.html b/docs/dyn/displayvideo_v1.partners.targetingTypes.assignedTargetingOptions.html
index 611251f..3bf9819 100644
--- a/docs/dyn/displayvideo_v1.partners.targetingTypes.assignedTargetingOptions.html
+++ b/docs/dyn/displayvideo_v1.partners.targetingTypes.assignedTargetingOptions.html
@@ -144,7 +144,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   body: object, The request body.
     The object takes the form of:
 
@@ -222,6 +225,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -310,6 +319,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -324,6 +337,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -497,6 +518,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -585,6 +612,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -599,6 +630,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -737,7 +776,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   assignedTargetingOptionId: string, Required. The ID of the assigned targeting option to delete. (required)
   x__xgafv: string, V1 error format.
     Allowed values
@@ -797,7 +839,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   assignedTargetingOptionId: string, Required. An identifier unique to the targeting type in this partner that identifies the assigned targeting option being requested. (required)
   x__xgafv: string, V1 error format.
     Allowed values
@@ -881,6 +926,12 @@
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
   },
+  &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+  },
   &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -969,6 +1020,10 @@
   &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
     &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+  },
   &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
     &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -983,6 +1038,14 @@
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
     &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
   },
+  &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+    &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+    &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+    &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+  },
   &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
     &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
     &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
@@ -1121,7 +1184,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   filter: string, Allows filtering by assigned targeting option properties. Supported syntax: * Filter expressions are made up of one or more restrictions. * Restrictions can be combined by the logical operator `OR`. * A restriction has the form of `{field} {operator} {value}`. * The operator must be `EQUALS (=)`. * Supported fields: - `assignedTargetingOptionId` Examples: * AssignedTargetingOption with ID 123456 `assignedTargetingOptionId=&quot;123456&quot;` The length of this field should be no more than 500 characters.
   orderBy: string, Field by which to sort the list. Acceptable values are: * `assignedTargetingOptionId` (default) The default sorting order is ascending. To specify descending order for a field, a suffix &quot;desc&quot; should be added to the field name. Example: `assignedTargetingOptionId desc`.
   pageSize: integer, Requested page size. Must be between `1` and `100`. If unspecified will default to `100`. Returns error code `INVALID_ARGUMENT` if an invalid value is specified.
@@ -1210,6 +1276,12 @@
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned browser targeting options on the same resource must have the same value for this field.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BROWSER`.
       },
+      &quot;businessChainDetails&quot;: { # Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.
+      },
       &quot;carrierAndIspDetails&quot;: { # Details for assigned carrier and ISP targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;negative&quot;: True or False, # Indicates if this option is being negatively targeted. All assigned carrier and ISP targeting options on the same resource must have the same value for this field.
@@ -1298,6 +1370,10 @@
       &quot;negativeKeywordListDetails&quot;: { # Targeting details for negative keyword list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. # Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource.
         &quot;negativeKeywordListId&quot;: &quot;A String&quot;, # Required. ID of the negative keyword list. Should refer to the negative_keyword_list_id field of a NegativeKeywordList resource.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.
+      },
       &quot;onScreenPositionDetails&quot;: { # On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.
         &quot;adType&quot;: &quot;A String&quot;, # Output only. The ad type to target. Only applicable to insertion order targeting and new line items supporting the specified ad type will inherit this targeting option by default. Possible values are: * `AD_TYPE_DISPLAY`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_DISPLAY_DEFAULT`. * `AD_TYPE_VIDEO`, the setting will be inherited by new line item when line_item_type is `LINE_ITEM_TYPE_VIDEO_DEFAULT`.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
@@ -1312,6 +1388,14 @@
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of the audience.
         &quot;targetingOptionId&quot;: &quot;A String&quot;, # Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_PARENTAL_STATUS`.
       },
+      &quot;poiDetails&quot;: { # Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`. # POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+        &quot;proximityRadiusAmount&quot;: 3.14, # Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.
+        &quot;proximityRadiusUnit&quot;: &quot;A String&quot;, # Required. The unit of distance by which the targeting radius is measured.
+        &quot;targetingOptionId&quot;: &quot;A String&quot;, # Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.
+      },
       &quot;proximityLocationListDetails&quot;: { # Targeting details for proximity location list. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`. # Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`.
         &quot;proximityLocationListId&quot;: &quot;A String&quot;, # Required. ID of the proximity location list. Should refer to the location_list_id field of a LocationList resource whose type is `TARGETING_LOCATION_TYPE_PROXIMITY`.
         &quot;proximityRadiusRange&quot;: &quot;A String&quot;, # Required. Radius range for proximity location list. This represents the size of the area around a chosen location that will be targeted. `All` proximity location targeting under a single resource must have the same radius range value. Set this value to match any existing targeting. If updated, this field will change the radius range for all proximity targeting under the resource.
diff --git a/docs/dyn/displayvideo_v1.targetingTypes.targetingOptions.html b/docs/dyn/displayvideo_v1.targetingTypes.targetingOptions.html
index 43b690b..b56241b 100644
--- a/docs/dyn/displayvideo_v1.targetingTypes.targetingOptions.html
+++ b/docs/dyn/displayvideo_v1.targetingTypes.targetingOptions.html
@@ -143,7 +143,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   targetingOptionId: string, Required. The ID of the of targeting option to retrieve. (required)
   advertiserId: string, Required. The Advertiser this request is being made in the context of.
   x__xgafv: string, V1 error format.
@@ -167,6 +170,11 @@
   &quot;browserDetails&quot;: { # Represents a targetable browser. This will be populated in the browser_details field when targeting_type is `TARGETING_TYPE_BROWSER`. # Browser details.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the browser.
   },
+  &quot;businessChainDetails&quot;: { # Represents a targetable business chain within a geo region. This will be populated in the business_chain_details field when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain resource details.
+    &quot;businessChain&quot;: &quot;A String&quot;, # Output only. The display name of the business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+    &quot;geoRegion&quot;: &quot;A String&quot;, # Output only. The display name of the geographic region, e.g. &quot;Ontario, Canada&quot;.
+    &quot;geoRegionType&quot;: &quot;A String&quot;, # Output only. The type of the geographic region.
+  },
   &quot;carrierAndIspDetails&quot;: { # Represents a targetable carrier or ISP. This will be populated in the carrier_and_isp_details field of a TargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details.
     &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
     &quot;type&quot;: &quot;A String&quot;, # Output only. The type indicating if it&#x27;s carrier or ISP.
@@ -212,6 +220,9 @@
   &quot;nativeContentPositionDetails&quot;: { # Represents a targetable native content position. This will be populated in the native_content_position_details field when targeting_type is `TARGETING_TYPE_NATIVE_CONTENT_POSITION`. # Native content position details.
     &quot;contentPosition&quot;: &quot;A String&quot;, # Output only. The content position.
   },
+  &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the omid_details field when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details.
+    &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+  },
   &quot;onScreenPositionDetails&quot;: { # Represents a targetable on screen position, which could be used by display and video ads. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details.
     &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
   },
@@ -221,6 +232,11 @@
   &quot;parentalStatusDetails&quot;: { # Represents a targetable parental status. This will be populated in the parental_status_details field of a TargetingOption when targeting_type is `TARGETING_TYPE_PARENTAL_STATUS`. # Parental status details.
     &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of an audience.
   },
+  &quot;poiDetails&quot;: { # Represents a targetable point of interest(POI). This will be populated in the poi_details field when targeting_type is `TARGETING_TYPE_POI`. # POI resource details.
+    &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+    &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+    &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+  },
   &quot;sensitiveCategoryDetails&quot;: { # Represents a targetable sensitive category. This will be populated in the sensitive_category_details field of the TargetingOption when targeting_type is `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`. # Sensitive Category details.
     &quot;sensitiveCategory&quot;: &quot;A String&quot;, # Output only. An enum for the DV360 Sensitive category content classifier.
   },
@@ -286,7 +302,10 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   advertiserId: string, Required. The Advertiser this request is being made in the context of.
   filter: string, Allows filtering by targeting option properties. Supported syntax: * Filter expressions are made up of one or more restrictions. * Restrictions can be combined by `OR` logical operators. * A restriction has the form of `{field} {operator} {value}`. * The operator must be &quot;=&quot; (equal sign). * Supported fields: - `carrierAndIspDetails.type` - `geoRegionDetails.geoRegionType` - `targetingOptionId` Examples: * All `GEO REGION` targeting options that belong to sub type `GEO_REGION_TYPE_COUNTRY` or `GEO_REGION_TYPE_STATE`: `geoRegionDetails.geoRegionType=&quot;GEO_REGION_TYPE_COUNTRY&quot; OR geoRegionDetails.geoRegionType=&quot;GEO_REGION_TYPE_STATE&quot;` * All `CARRIER AND ISP` targeting options that belong to sub type `CARRIER_AND_ISP_TYPE_CARRIER`: `carrierAndIspDetails.type=&quot;CARRIER_AND_ISP_TYPE_CARRIER&quot;`. The length of this field should be no more than 500 characters.
   orderBy: string, Field by which to sort the list. Acceptable values are: * `targetingOptionId` (default) The default sorting order is ascending. To specify descending order for a field, a suffix &quot;desc&quot; should be added to the field name. Example: `targetingOptionId desc`.
@@ -316,6 +335,11 @@
       &quot;browserDetails&quot;: { # Represents a targetable browser. This will be populated in the browser_details field when targeting_type is `TARGETING_TYPE_BROWSER`. # Browser details.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the browser.
       },
+      &quot;businessChainDetails&quot;: { # Represents a targetable business chain within a geo region. This will be populated in the business_chain_details field when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain resource details.
+        &quot;businessChain&quot;: &quot;A String&quot;, # Output only. The display name of the business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;geoRegion&quot;: &quot;A String&quot;, # Output only. The display name of the geographic region, e.g. &quot;Ontario, Canada&quot;.
+        &quot;geoRegionType&quot;: &quot;A String&quot;, # Output only. The type of the geographic region.
+      },
       &quot;carrierAndIspDetails&quot;: { # Represents a targetable carrier or ISP. This will be populated in the carrier_and_isp_details field of a TargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;type&quot;: &quot;A String&quot;, # Output only. The type indicating if it&#x27;s carrier or ISP.
@@ -361,6 +385,9 @@
       &quot;nativeContentPositionDetails&quot;: { # Represents a targetable native content position. This will be populated in the native_content_position_details field when targeting_type is `TARGETING_TYPE_NATIVE_CONTENT_POSITION`. # Native content position details.
         &quot;contentPosition&quot;: &quot;A String&quot;, # Output only. The content position.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the omid_details field when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+      },
       &quot;onScreenPositionDetails&quot;: { # Represents a targetable on screen position, which could be used by display and video ads. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
       },
@@ -370,6 +397,11 @@
       &quot;parentalStatusDetails&quot;: { # Represents a targetable parental status. This will be populated in the parental_status_details field of a TargetingOption when targeting_type is `TARGETING_TYPE_PARENTAL_STATUS`. # Parental status details.
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of an audience.
       },
+      &quot;poiDetails&quot;: { # Represents a targetable point of interest(POI). This will be populated in the poi_details field when targeting_type is `TARGETING_TYPE_POI`. # POI resource details.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+      },
       &quot;sensitiveCategoryDetails&quot;: { # Represents a targetable sensitive category. This will be populated in the sensitive_category_details field of the TargetingOption when targeting_type is `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`. # Sensitive Category details.
         &quot;sensitiveCategory&quot;: &quot;A String&quot;, # Output only. An enum for the DV360 Sensitive category content classifier.
       },
@@ -411,7 +443,7 @@
   <pre>Searches for targeting options of a given type based on the given search terms.
 
 Args:
-  targetingType: string, Required. The type of targeting options to retrieve. Accepted values are: * `TARGETING_TYPE_GEO_REGION` (required)
+  targetingType: string, Required. The type of targeting options to retrieve. Accepted values are: * `TARGETING_TYPE_GEO_REGION` * `TARGETING_TYPE_POI` * `TARGETING_TYPE_BUSINESS_CHAIN` (required)
     Allowed values
       TARGETING_TYPE_UNSPECIFIED - Default value when type is not specified or is unknown in this version.
       TARGETING_TYPE_CHANNEL - Target a channel (a custom group of related websites or apps).
@@ -451,17 +483,27 @@
       TARGETING_TYPE_INVENTORY_SOURCE_GROUP - Purchase impressions from a group of deals and auction packages.
       TARGETING_TYPE_EXCHANGE - Purchase impressions from specific exchanges.
       TARGETING_TYPE_SUB_EXCHANGE - Purchase impressions from specific sub-exchanges.
+      TARGETING_TYPE_POI - Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.
+      TARGETING_TYPE_BUSINESS_CHAIN - Target ads around locations of a business chain within a specific geo region.
       TARGETING_TYPE_NATIVE_CONTENT_POSITION - Target ads to a specific native content position.
+      TARGETING_TYPE_OMID - Target ads in an Open Measurement enabled inventory.
   body: object, The request body.
     The object takes the form of:
 
 { # Request message for SearchTargetingOptions.
   &quot;advertiserId&quot;: &quot;A String&quot;, # Required. The Advertiser this request is being made in the context of.
+  &quot;businessChainSearchTerms&quot;: { # Search terms for Business Chain targeting options. At least one of the field should be populated. # Search terms for Business Chain targeting options. Can only be used when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.
+    &quot;businessChain&quot;: &quot;A String&quot;, # The search query for the desired business chain. The query can be a prefix, e.g. &quot;KFC&quot;, &quot;mercede&quot;.
+    &quot;region&quot;: &quot;A String&quot;, # The search query for the desired geo region, e.g. &quot;Seattle&quot;, &quot;United State&quot;.
+  },
   &quot;geoRegionSearchTerms&quot;: { # Search terms for geo region targeting options. # Search terms for geo region targeting options. Can only be used when targeting_type is `TARGETING_TYPE_GEO_REGION`.
     &quot;geoRegionQuery&quot;: &quot;A String&quot;, # The search query for the desired geo region. The query can be a prefix, e.g. &quot;New Yor&quot;, &quot;Seattle&quot;, &quot;USA&quot;, etc.
   },
   &quot;pageSize&quot;: 42, # Requested page size. Must be between `1` and `100`. If unspecified will default to `100`. Returns error code `INVALID_ARGUMENT` if an invalid value is specified.
   &quot;pageToken&quot;: &quot;A String&quot;, # A token identifying a page of results the server should return. Typically, this is the value of next_page_token returned from the previous call to `SearchTargetingOptions` method. If not specified, the first page of results will be returned.
+  &quot;poiSearchTerms&quot;: { # Search terms for POI targeting options. # Search terms for POI targeting options. Can only be used when targeting_type is `TARGETING_TYPE_POI`.
+    &quot;poiQuery&quot;: &quot;A String&quot;, # The search query for the desired POI name, street address, or coordinate of the desired POI. The query can be a prefix, e.g. &quot;Times squar&quot;, &quot;40.7505045,-73.99562&quot;, &quot;315 W 44th St&quot;, etc.
+  },
 }
 
   x__xgafv: string, V1 error format.
@@ -488,6 +530,11 @@
       &quot;browserDetails&quot;: { # Represents a targetable browser. This will be populated in the browser_details field when targeting_type is `TARGETING_TYPE_BROWSER`. # Browser details.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the browser.
       },
+      &quot;businessChainDetails&quot;: { # Represents a targetable business chain within a geo region. This will be populated in the business_chain_details field when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`. # Business chain resource details.
+        &quot;businessChain&quot;: &quot;A String&quot;, # Output only. The display name of the business chain, e.g. &quot;KFC&quot;, &quot;Chase Bank&quot;.
+        &quot;geoRegion&quot;: &quot;A String&quot;, # Output only. The display name of the geographic region, e.g. &quot;Ontario, Canada&quot;.
+        &quot;geoRegionType&quot;: &quot;A String&quot;, # Output only. The type of the geographic region.
+      },
       &quot;carrierAndIspDetails&quot;: { # Represents a targetable carrier or ISP. This will be populated in the carrier_and_isp_details field of a TargetingOption when targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`. # Carrier and ISP details.
         &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of the carrier or ISP.
         &quot;type&quot;: &quot;A String&quot;, # Output only. The type indicating if it&#x27;s carrier or ISP.
@@ -533,6 +580,9 @@
       &quot;nativeContentPositionDetails&quot;: { # Represents a targetable native content position. This will be populated in the native_content_position_details field when targeting_type is `TARGETING_TYPE_NATIVE_CONTENT_POSITION`. # Native content position details.
         &quot;contentPosition&quot;: &quot;A String&quot;, # Output only. The content position.
       },
+      &quot;omidDetails&quot;: { # Represents a targetable Open Measurement enabled inventory type. This will be populated in the omid_details field when targeting_type is `TARGETING_TYPE_OMID`. # Open Measurement enabled inventory details.
+        &quot;omid&quot;: &quot;A String&quot;, # Output only. The type of Open Measurement enabled inventory.
+      },
       &quot;onScreenPositionDetails&quot;: { # Represents a targetable on screen position, which could be used by display and video ads. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`. # On screen position details.
         &quot;onScreenPosition&quot;: &quot;A String&quot;, # Output only. The on screen position.
       },
@@ -542,6 +592,11 @@
       &quot;parentalStatusDetails&quot;: { # Represents a targetable parental status. This will be populated in the parental_status_details field of a TargetingOption when targeting_type is `TARGETING_TYPE_PARENTAL_STATUS`. # Parental status details.
         &quot;parentalStatus&quot;: &quot;A String&quot;, # Output only. The parental status of an audience.
       },
+      &quot;poiDetails&quot;: { # Represents a targetable point of interest(POI). This will be populated in the poi_details field when targeting_type is `TARGETING_TYPE_POI`. # POI resource details.
+        &quot;displayName&quot;: &quot;A String&quot;, # Output only. The display name of a POI, e.g. &quot;Times Square&quot;, &quot;Space Needle&quot;.
+        &quot;latitude&quot;: 3.14, # Output only. Latitude of the POI rounding to 6th decimal place.
+        &quot;longitude&quot;: 3.14, # Output only. Longitude of the POI rounding to 6th decimal place.
+      },
       &quot;sensitiveCategoryDetails&quot;: { # Represents a targetable sensitive category. This will be populated in the sensitive_category_details field of the TargetingOption when targeting_type is `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`. # Sensitive Category details.
         &quot;sensitiveCategory&quot;: &quot;A String&quot;, # Output only. An enum for the DV360 Sensitive category content classifier.
       },
diff --git a/docs/dyn/dns_v1beta2.changes.html b/docs/dyn/dns_v1beta2.changes.html
index b64cfd1..088925e 100644
--- a/docs/dyn/dns_v1beta2.changes.html
+++ b/docs/dyn/dns_v1beta2.changes.html
@@ -110,6 +110,93 @@
     { # A unit of data that is returned by the DNS servers.
       &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
       &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+      &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+        &quot;geo&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;geoPolicy&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+        &quot;wrr&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+        &quot;wrrPolicy&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+      },
       &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
         &quot;A String&quot;,
       ],
@@ -124,6 +211,93 @@
     { # A unit of data that is returned by the DNS servers.
       &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
       &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+      &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+        &quot;geo&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;geoPolicy&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+        &quot;wrr&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+        &quot;wrrPolicy&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+      },
       &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
         &quot;A String&quot;,
       ],
@@ -155,6 +329,93 @@
     { # A unit of data that is returned by the DNS servers.
       &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
       &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+      &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+        &quot;geo&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;geoPolicy&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+        &quot;wrr&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+        &quot;wrrPolicy&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+      },
       &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
         &quot;A String&quot;,
       ],
@@ -169,6 +430,93 @@
     { # A unit of data that is returned by the DNS servers.
       &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
       &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+      &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+        &quot;geo&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;geoPolicy&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+        &quot;wrr&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+        &quot;wrrPolicy&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+      },
       &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
         &quot;A String&quot;,
       ],
@@ -209,6 +557,93 @@
     { # A unit of data that is returned by the DNS servers.
       &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
       &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+      &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+        &quot;geo&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;geoPolicy&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+        &quot;wrr&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+        &quot;wrrPolicy&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+      },
       &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
         &quot;A String&quot;,
       ],
@@ -223,6 +658,93 @@
     { # A unit of data that is returned by the DNS servers.
       &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
       &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+      &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+        &quot;geo&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;geoPolicy&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+        &quot;wrr&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+        &quot;wrrPolicy&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+      },
       &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
         &quot;A String&quot;,
       ],
@@ -269,6 +791,93 @@
         { # A unit of data that is returned by the DNS servers.
           &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
           &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+          &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+            &quot;geo&quot;: {
+              &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+            },
+            &quot;geoPolicy&quot;: {
+              &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+            },
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+            &quot;wrr&quot;: {
+              &quot;items&quot;: [
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                  &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+            },
+            &quot;wrrPolicy&quot;: {
+              &quot;items&quot;: [
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                  &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+            },
+          },
           &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
             &quot;A String&quot;,
           ],
@@ -283,6 +892,93 @@
         { # A unit of data that is returned by the DNS servers.
           &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
           &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+          &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+            &quot;geo&quot;: {
+              &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+            },
+            &quot;geoPolicy&quot;: {
+              &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+            },
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+            &quot;wrr&quot;: {
+              &quot;items&quot;: [
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                  &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+            },
+            &quot;wrrPolicy&quot;: {
+              &quot;items&quot;: [
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                  &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+            },
+          },
           &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
             &quot;A String&quot;,
           ],
diff --git a/docs/dyn/dns_v1beta2.projects.html b/docs/dyn/dns_v1beta2.projects.html
index 3e5ff10..bde90ca 100644
--- a/docs/dyn/dns_v1beta2.projects.html
+++ b/docs/dyn/dns_v1beta2.projects.html
@@ -109,6 +109,7 @@
     &quot;dnsKeysPerManagedZone&quot;: 42, # Maximum allowed number of DnsKeys per ManagedZone.
     &quot;gkeClustersPerManagedZone&quot;: 42, # Maximum allowed number of GKE clusters to which a privately scoped zone can be attached.
     &quot;gkeClustersPerResponsePolicy&quot;: 42, # Maximum allowed number of GKE clusters per response policy.
+    &quot;itemsPerRoutingPolicy&quot;: 42, # Maximum allowed number of items per routing policy.
     &quot;kind&quot;: &quot;dns#quota&quot;,
     &quot;managedZones&quot;: 42, # Maximum allowed number of managed zones in the project.
     &quot;managedZonesPerGkeCluster&quot;: 42, # Maximum allowed number of managed zones which can be attached to a GKE cluster.
diff --git a/docs/dyn/dns_v1beta2.resourceRecordSets.html b/docs/dyn/dns_v1beta2.resourceRecordSets.html
index 3467c6a..c6e3d50 100644
--- a/docs/dyn/dns_v1beta2.resourceRecordSets.html
+++ b/docs/dyn/dns_v1beta2.resourceRecordSets.html
@@ -114,6 +114,93 @@
 { # A unit of data that is returned by the DNS servers.
   &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
   &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+  &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+    &quot;geo&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;geoPolicy&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+    &quot;wrr&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+    &quot;wrrPolicy&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+  },
   &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
     &quot;A String&quot;,
   ],
@@ -136,6 +223,93 @@
     { # A unit of data that is returned by the DNS servers.
   &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
   &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+  &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+    &quot;geo&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;geoPolicy&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+    &quot;wrr&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+    &quot;wrrPolicy&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+  },
   &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
     &quot;A String&quot;,
   ],
@@ -185,6 +359,93 @@
     { # A unit of data that is returned by the DNS servers.
   &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
   &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+  &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+    &quot;geo&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;geoPolicy&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+    &quot;wrr&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+    &quot;wrrPolicy&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+  },
   &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
     &quot;A String&quot;,
   ],
@@ -225,6 +486,93 @@
     { # A unit of data that is returned by the DNS servers.
       &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
       &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+      &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+        &quot;geo&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;geoPolicy&quot;: {
+          &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+              &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                &quot;A String&quot;,
+              ],
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+        },
+        &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+        &quot;wrr&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+        &quot;wrrPolicy&quot;: {
+          &quot;items&quot;: [
+            {
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+              &quot;rrdatas&quot;: [
+                &quot;A String&quot;,
+              ],
+              &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                &quot;A String&quot;,
+              ],
+              &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+            },
+          ],
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+        },
+      },
       &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
         &quot;A String&quot;,
       ],
@@ -267,6 +615,93 @@
 { # A unit of data that is returned by the DNS servers.
   &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
   &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+  &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+    &quot;geo&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;geoPolicy&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+    &quot;wrr&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+    &quot;wrrPolicy&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+  },
   &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
     &quot;A String&quot;,
   ],
@@ -289,6 +724,93 @@
     { # A unit of data that is returned by the DNS servers.
   &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
   &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+  &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+    &quot;geo&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;geoPolicy&quot;: {
+      &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+          &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+            &quot;A String&quot;,
+          ],
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+    },
+    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+    &quot;wrr&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+    &quot;wrrPolicy&quot;: {
+      &quot;items&quot;: [
+        {
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+          &quot;rrdatas&quot;: [
+            &quot;A String&quot;,
+          ],
+          &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+            &quot;A String&quot;,
+          ],
+          &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+        },
+      ],
+      &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+    },
+  },
   &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
     &quot;A String&quot;,
   ],
diff --git a/docs/dyn/dns_v1beta2.responsePolicyRules.html b/docs/dyn/dns_v1beta2.responsePolicyRules.html
index 5b74551..2b10b9d 100644
--- a/docs/dyn/dns_v1beta2.responsePolicyRules.html
+++ b/docs/dyn/dns_v1beta2.responsePolicyRules.html
@@ -123,6 +123,93 @@
       { # A unit of data that is returned by the DNS servers.
         &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
         &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+        &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+          &quot;geo&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;geoPolicy&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+          &quot;wrr&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+          &quot;wrrPolicy&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+        },
         &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
           &quot;A String&quot;,
         ],
@@ -155,6 +242,93 @@
       { # A unit of data that is returned by the DNS servers.
         &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
         &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+        &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+          &quot;geo&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;geoPolicy&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+          &quot;wrr&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+          &quot;wrrPolicy&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+        },
         &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
           &quot;A String&quot;,
         ],
@@ -212,6 +386,93 @@
       { # A unit of data that is returned by the DNS servers.
         &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
         &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+        &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+          &quot;geo&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;geoPolicy&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+          &quot;wrr&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+          &quot;wrrPolicy&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+        },
         &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
           &quot;A String&quot;,
         ],
@@ -259,6 +520,93 @@
           { # A unit of data that is returned by the DNS servers.
             &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
             &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+            &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+              &quot;geo&quot;: {
+                &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                  {
+                    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                    &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                    &quot;rrdatas&quot;: [
+                      &quot;A String&quot;,
+                    ],
+                    &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                      &quot;A String&quot;,
+                    ],
+                  },
+                ],
+                &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                  {
+                    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                    &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                    &quot;rrdatas&quot;: [
+                      &quot;A String&quot;,
+                    ],
+                    &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                      &quot;A String&quot;,
+                    ],
+                  },
+                ],
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+              },
+              &quot;geoPolicy&quot;: {
+                &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                  {
+                    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                    &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                    &quot;rrdatas&quot;: [
+                      &quot;A String&quot;,
+                    ],
+                    &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                      &quot;A String&quot;,
+                    ],
+                  },
+                ],
+                &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                  {
+                    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                    &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                    &quot;rrdatas&quot;: [
+                      &quot;A String&quot;,
+                    ],
+                    &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                      &quot;A String&quot;,
+                    ],
+                  },
+                ],
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+              },
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+              &quot;wrr&quot;: {
+                &quot;items&quot;: [
+                  {
+                    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                    &quot;rrdatas&quot;: [
+                      &quot;A String&quot;,
+                    ],
+                    &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                      &quot;A String&quot;,
+                    ],
+                    &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                  },
+                ],
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+              },
+              &quot;wrrPolicy&quot;: {
+                &quot;items&quot;: [
+                  {
+                    &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                    &quot;rrdatas&quot;: [
+                      &quot;A String&quot;,
+                    ],
+                    &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                      &quot;A String&quot;,
+                    ],
+                    &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                  },
+                ],
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+              },
+            },
             &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
               &quot;A String&quot;,
             ],
@@ -310,6 +658,93 @@
       { # A unit of data that is returned by the DNS servers.
         &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
         &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+        &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+          &quot;geo&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;geoPolicy&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+          &quot;wrr&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+          &quot;wrrPolicy&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+        },
         &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
           &quot;A String&quot;,
         ],
@@ -346,6 +781,93 @@
         { # A unit of data that is returned by the DNS servers.
           &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
           &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+          &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+            &quot;geo&quot;: {
+              &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+            },
+            &quot;geoPolicy&quot;: {
+              &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+            },
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+            &quot;wrr&quot;: {
+              &quot;items&quot;: [
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                  &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+            },
+            &quot;wrrPolicy&quot;: {
+              &quot;items&quot;: [
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                  &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+            },
+          },
           &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
             &quot;A String&quot;,
           ],
@@ -382,6 +904,93 @@
       { # A unit of data that is returned by the DNS servers.
         &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
         &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+        &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+          &quot;geo&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;geoPolicy&quot;: {
+            &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                  &quot;A String&quot;,
+                ],
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+          },
+          &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+          &quot;wrr&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+          &quot;wrrPolicy&quot;: {
+            &quot;items&quot;: [
+              {
+                &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                &quot;rrdatas&quot;: [
+                  &quot;A String&quot;,
+                ],
+                &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                  &quot;A String&quot;,
+                ],
+                &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+              },
+            ],
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+          },
+        },
         &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
           &quot;A String&quot;,
         ],
@@ -418,6 +1027,93 @@
         { # A unit of data that is returned by the DNS servers.
           &quot;kind&quot;: &quot;dns#resourceRecordSet&quot;,
           &quot;name&quot;: &quot;A String&quot;, # For example, www.example.com.
+          &quot;routingPolicy&quot;: { # A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection. # Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise.
+            &quot;geo&quot;: {
+              &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+            },
+            &quot;geoPolicy&quot;: {
+              &quot;failovers&quot;: [ # If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won&#x27;t be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;items&quot;: [ # The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem&quot;,
+                  &quot;location&quot;: &quot;A String&quot;, # The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. &quot;us-east1&quot;, &quot;southamerica-east1&quot;, &quot;asia-east1&quot;, etc.
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above geo_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyGeoPolicy&quot;,
+            },
+            &quot;kind&quot;: &quot;dns#rRSetRoutingPolicy&quot;,
+            &quot;wrr&quot;: {
+              &quot;items&quot;: [
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                  &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+            },
+            &quot;wrrPolicy&quot;: {
+              &quot;items&quot;: [
+                {
+                  &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem&quot;,
+                  &quot;rrdatas&quot;: [
+                    &quot;A String&quot;,
+                  ],
+                  &quot;signatureRrdatas&quot;: [ # DNSSEC generated signatures for the above wrr_rrdata.
+                    &quot;A String&quot;,
+                  ],
+                  &quot;weight&quot;: 3.14, # The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.
+                },
+              ],
+              &quot;kind&quot;: &quot;dns#rRSetRoutingPolicyWrrPolicy&quot;,
+            },
+          },
           &quot;rrdatas&quot;: [ # As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.
             &quot;A String&quot;,
           ],
diff --git a/docs/dyn/eventarc_v1.projects.locations.channels.html b/docs/dyn/eventarc_v1.projects.locations.channels.html
new file mode 100644
index 0000000..5c1f77c
--- /dev/null
+++ b/docs/dyn/eventarc_v1.projects.locations.channels.html
@@ -0,0 +1,258 @@
+<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="eventarc_v1.html">Eventarc API</a> . <a href="eventarc_v1.projects.html">projects</a> . <a href="eventarc_v1.projects.locations.html">locations</a> . <a href="eventarc_v1.projects.locations.channels.html">channels</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="#getIamPolicy">getIamPolicy(resource, options_requestedPolicyVersion=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Gets the access control policy for a resource. Returns an empty policy if the resource exists and does not have a policy set.</p>
+<p class="toc_element">
+  <code><a href="#setIamPolicy">setIamPolicy(resource, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Sets the access control policy on the specified resource. Replaces any existing policy. Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors.</p>
+<p class="toc_element">
+  <code><a href="#testIamPermissions">testIamPermissions(resource, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns permissions that a caller has on the specified resource. If the resource does not exist, this will return an empty set of permissions, not a `NOT_FOUND` error. Note: This operation is designed to be used for building permission-aware UIs and command-line tools, not for authorization checking. This operation may "fail open" without warning.</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="getIamPolicy">getIamPolicy(resource, options_requestedPolicyVersion=None, x__xgafv=None)</code>
+  <pre>Gets the access control policy for a resource. Returns an empty policy if the resource exists and does not have a policy set.
+
+Args:
+  resource: string, REQUIRED: The resource for which the policy is being requested. See the operation documentation for the appropriate value for this field. (required)
+  options_requestedPolicyVersion: integer, Optional. The policy format version to be returned. Valid values are 0, 1, and 3. Requests specifying an invalid value will be rejected. Requests for policies with any conditional bindings must specify version 3. Policies without any conditional bindings may specify any valid value or leave the field unset. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Identity and Access Management (IAM) policy, which specifies access controls for Google Cloud resources. A `Policy` is a collection of `bindings`. A `binding` binds one or more `members` to a single `role`. Members can be user accounts, service accounts, Google groups, and domains (such as G Suite). A `role` is a named list of permissions; each `role` can be an IAM predefined role or a user-created custom role. For some types of Google Cloud resources, a `binding` can also specify a `condition`, which is a logical expression that allows access to a resource only if the expression evaluates to `true`. A condition can add constraints based on attributes of the request, the resource, or both. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies). **JSON example:** { &quot;bindings&quot;: [ { &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;, &quot;members&quot;: [ &quot;user:mike@example.com&quot;, &quot;group:admins@example.com&quot;, &quot;domain:google.com&quot;, &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot; ] }, { &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;, &quot;members&quot;: [ &quot;user:eve@example.com&quot; ], &quot;condition&quot;: { &quot;title&quot;: &quot;expirable access&quot;, &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;, &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;, } } ], &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;, &quot;version&quot;: 3 } **YAML example:** bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;) - etag: BwWWja0YfJA= - version: 3 For a description of IAM and its features, see the [IAM documentation](https://cloud.google.com/iam/docs/).
+  &quot;auditConfigs&quot;: [ # Specifies cloud audit logging configuration for this policy.
+    { # Specifies the audit configuration for a service. The configuration determines which permission types are logged, and what identities, if any, are exempted from logging. An AuditConfig must have one or more AuditLogConfigs. If there are AuditConfigs for both `allServices` and a specific service, the union of the two AuditConfigs is used for that service: the log_types specified in each AuditConfig are enabled, and the exempted_members in each AuditLogConfig are exempted. Example Policy with multiple AuditConfigs: { &quot;audit_configs&quot;: [ { &quot;service&quot;: &quot;allServices&quot;, &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot;, &quot;exempted_members&quot;: [ &quot;user:jose@example.com&quot; ] }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot; }, { &quot;log_type&quot;: &quot;ADMIN_READ&quot; } ] }, { &quot;service&quot;: &quot;sampleservice.googleapis.com&quot;, &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot; }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot;, &quot;exempted_members&quot;: [ &quot;user:aliya@example.com&quot; ] } ] } ] } For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ logging. It also exempts jose@example.com from DATA_READ logging, and aliya@example.com from DATA_WRITE logging.
+      &quot;auditLogConfigs&quot;: [ # The configuration for logging of each type of permission.
+        { # Provides the configuration for logging a type of permissions. Example: { &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot;, &quot;exempted_members&quot;: [ &quot;user:jose@example.com&quot; ] }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot; } ] } This enables &#x27;DATA_READ&#x27; and &#x27;DATA_WRITE&#x27; logging, while exempting jose@example.com from DATA_READ logging.
+          &quot;exemptedMembers&quot;: [ # Specifies the identities that do not cause logging for this type of permission. Follows the same format of Binding.members.
+            &quot;A String&quot;,
+          ],
+          &quot;logType&quot;: &quot;A String&quot;, # The log type that this config enables.
+        },
+      ],
+      &quot;service&quot;: &quot;A String&quot;, # Specifies a service that will be enabled for audit logging. For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. `allServices` is a special value that covers all services.
+    },
+  ],
+  &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a `condition` that determines how and when the `bindings` are applied. Each of the `bindings` must contain at least one member.
+    { # Associates `members` with a `role`.
+      &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) syntax. CEL is a C-like expression language. The syntax and semantics of CEL are documented at https://github.com/google/cel-spec. Example (Comparison): title: &quot;Summary size limit&quot; description: &quot;Determines if a summary is less than 100 chars&quot; expression: &quot;document.summary.size() &lt; 100&quot; Example (Equality): title: &quot;Requestor is owner&quot; description: &quot;Determines if requestor is the document owner&quot; expression: &quot;document.owner == request.auth.claims.email&quot; Example (Logic): title: &quot;Public documents&quot; description: &quot;Determine whether the document should be publicly visible&quot; expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot; Example (Data Manipulation): title: &quot;Notification string&quot; description: &quot;Create a notification string with a timestamp.&quot; expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot; The exact variables and functions that may be referenced within an expression are determined by the service that evaluates it. See the service documentation for additional information. # The condition that is associated with this binding. If the condition evaluates to `true`, then this binding applies to the current request. If the condition evaluates to `false`, then this binding does not apply to the current request. However, a different role binding might grant the same role to one or more of the members in this binding. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
+        &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI.
+        &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language syntax.
+        &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error reporting, e.g. a file name and a position in the file.
+        &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression.
+      },
+      &quot;members&quot;: [ # Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values: * `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account. * `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account. * `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@example.com` . * `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`. * `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`. * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a user that has been recently deleted. For example, `alice@example.com?uid=123456789012345678901`. If the user is recovered, this value reverts to `user:{emailid}` and the recovered user retains the role in the binding. * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a service account that has been recently deleted. For example, `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`. If the service account is undeleted, this value reverts to `serviceAccount:{emailid}` and the undeleted service account retains the role in the binding. * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a Google group that has been recently deleted. For example, `admins@example.com?uid=123456789012345678901`. If the group is recovered, this value reverts to `group:{emailid}` and the recovered group retains the role in the binding. * `domain:{domain}`: The G Suite domain (primary) that represents all the users of that domain. For example, `google.com` or `example.com`.
+        &quot;A String&quot;,
+      ],
+      &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`. For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
+    },
+  ],
+  &quot;etag&quot;: &quot;A String&quot;, # `etag` is used for optimistic concurrency control as a way to help prevent simultaneous updates of a policy from overwriting each other. It is strongly suggested that systems make use of the `etag` in the read-modify-write cycle to perform policy updates in order to avoid race conditions: An `etag` is returned in the response to `getIamPolicy`, and systems are expected to put that etag in the request to `setIamPolicy` to ensure that their change will be applied to the same version of the policy. **Important:** If you use IAM Conditions, you must include the `etag` field whenever you call `setIamPolicy`. If you omit this field, then IAM allows you to overwrite a version `3` policy with a version `1` policy, and all of the conditions in the version `3` policy are lost.
+  &quot;version&quot;: 42, # Specifies the format of the policy. Valid values are `0`, `1`, and `3`. Requests that specify an invalid value are rejected. Any operation that affects conditional role bindings must specify version `3`. This requirement applies to the following operations: * Getting a policy that includes a conditional role binding * Adding a conditional role binding to a policy * Changing a conditional role binding in a policy * Removing any role binding, with or without a condition, from a policy that includes conditions **Important:** If you use IAM Conditions, you must include the `etag` field whenever you call `setIamPolicy`. If you omit this field, then IAM allows you to overwrite a version `3` policy with a version `1` policy, and all of the conditions in the version `3` policy are lost. If a policy does not include any conditions, operations on that policy may specify any valid version or leave the field unset. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="setIamPolicy">setIamPolicy(resource, body=None, x__xgafv=None)</code>
+  <pre>Sets the access control policy on the specified resource. Replaces any existing policy. Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors.
+
+Args:
+  resource: string, REQUIRED: The resource for which the policy is being specified. See the operation documentation for the appropriate value for this field. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for `SetIamPolicy` method.
+  &quot;policy&quot;: { # An Identity and Access Management (IAM) policy, which specifies access controls for Google Cloud resources. A `Policy` is a collection of `bindings`. A `binding` binds one or more `members` to a single `role`. Members can be user accounts, service accounts, Google groups, and domains (such as G Suite). A `role` is a named list of permissions; each `role` can be an IAM predefined role or a user-created custom role. For some types of Google Cloud resources, a `binding` can also specify a `condition`, which is a logical expression that allows access to a resource only if the expression evaluates to `true`. A condition can add constraints based on attributes of the request, the resource, or both. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies). **JSON example:** { &quot;bindings&quot;: [ { &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;, &quot;members&quot;: [ &quot;user:mike@example.com&quot;, &quot;group:admins@example.com&quot;, &quot;domain:google.com&quot;, &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot; ] }, { &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;, &quot;members&quot;: [ &quot;user:eve@example.com&quot; ], &quot;condition&quot;: { &quot;title&quot;: &quot;expirable access&quot;, &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;, &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;, } } ], &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;, &quot;version&quot;: 3 } **YAML example:** bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;) - etag: BwWWja0YfJA= - version: 3 For a description of IAM and its features, see the [IAM documentation](https://cloud.google.com/iam/docs/). # REQUIRED: The complete policy to be applied to the `resource`. The size of the policy is limited to a few 10s of KB. An empty policy is a valid policy but certain Cloud Platform services (such as Projects) might reject them.
+    &quot;auditConfigs&quot;: [ # Specifies cloud audit logging configuration for this policy.
+      { # Specifies the audit configuration for a service. The configuration determines which permission types are logged, and what identities, if any, are exempted from logging. An AuditConfig must have one or more AuditLogConfigs. If there are AuditConfigs for both `allServices` and a specific service, the union of the two AuditConfigs is used for that service: the log_types specified in each AuditConfig are enabled, and the exempted_members in each AuditLogConfig are exempted. Example Policy with multiple AuditConfigs: { &quot;audit_configs&quot;: [ { &quot;service&quot;: &quot;allServices&quot;, &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot;, &quot;exempted_members&quot;: [ &quot;user:jose@example.com&quot; ] }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot; }, { &quot;log_type&quot;: &quot;ADMIN_READ&quot; } ] }, { &quot;service&quot;: &quot;sampleservice.googleapis.com&quot;, &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot; }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot;, &quot;exempted_members&quot;: [ &quot;user:aliya@example.com&quot; ] } ] } ] } For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ logging. It also exempts jose@example.com from DATA_READ logging, and aliya@example.com from DATA_WRITE logging.
+        &quot;auditLogConfigs&quot;: [ # The configuration for logging of each type of permission.
+          { # Provides the configuration for logging a type of permissions. Example: { &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot;, &quot;exempted_members&quot;: [ &quot;user:jose@example.com&quot; ] }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot; } ] } This enables &#x27;DATA_READ&#x27; and &#x27;DATA_WRITE&#x27; logging, while exempting jose@example.com from DATA_READ logging.
+            &quot;exemptedMembers&quot;: [ # Specifies the identities that do not cause logging for this type of permission. Follows the same format of Binding.members.
+              &quot;A String&quot;,
+            ],
+            &quot;logType&quot;: &quot;A String&quot;, # The log type that this config enables.
+          },
+        ],
+        &quot;service&quot;: &quot;A String&quot;, # Specifies a service that will be enabled for audit logging. For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. `allServices` is a special value that covers all services.
+      },
+    ],
+    &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a `condition` that determines how and when the `bindings` are applied. Each of the `bindings` must contain at least one member.
+      { # Associates `members` with a `role`.
+        &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) syntax. CEL is a C-like expression language. The syntax and semantics of CEL are documented at https://github.com/google/cel-spec. Example (Comparison): title: &quot;Summary size limit&quot; description: &quot;Determines if a summary is less than 100 chars&quot; expression: &quot;document.summary.size() &lt; 100&quot; Example (Equality): title: &quot;Requestor is owner&quot; description: &quot;Determines if requestor is the document owner&quot; expression: &quot;document.owner == request.auth.claims.email&quot; Example (Logic): title: &quot;Public documents&quot; description: &quot;Determine whether the document should be publicly visible&quot; expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot; Example (Data Manipulation): title: &quot;Notification string&quot; description: &quot;Create a notification string with a timestamp.&quot; expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot; The exact variables and functions that may be referenced within an expression are determined by the service that evaluates it. See the service documentation for additional information. # The condition that is associated with this binding. If the condition evaluates to `true`, then this binding applies to the current request. If the condition evaluates to `false`, then this binding does not apply to the current request. However, a different role binding might grant the same role to one or more of the members in this binding. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
+          &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI.
+          &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language syntax.
+          &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error reporting, e.g. a file name and a position in the file.
+          &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression.
+        },
+        &quot;members&quot;: [ # Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values: * `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account. * `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account. * `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@example.com` . * `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`. * `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`. * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a user that has been recently deleted. For example, `alice@example.com?uid=123456789012345678901`. If the user is recovered, this value reverts to `user:{emailid}` and the recovered user retains the role in the binding. * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a service account that has been recently deleted. For example, `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`. If the service account is undeleted, this value reverts to `serviceAccount:{emailid}` and the undeleted service account retains the role in the binding. * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a Google group that has been recently deleted. For example, `admins@example.com?uid=123456789012345678901`. If the group is recovered, this value reverts to `group:{emailid}` and the recovered group retains the role in the binding. * `domain:{domain}`: The G Suite domain (primary) that represents all the users of that domain. For example, `google.com` or `example.com`.
+          &quot;A String&quot;,
+        ],
+        &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`. For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
+      },
+    ],
+    &quot;etag&quot;: &quot;A String&quot;, # `etag` is used for optimistic concurrency control as a way to help prevent simultaneous updates of a policy from overwriting each other. It is strongly suggested that systems make use of the `etag` in the read-modify-write cycle to perform policy updates in order to avoid race conditions: An `etag` is returned in the response to `getIamPolicy`, and systems are expected to put that etag in the request to `setIamPolicy` to ensure that their change will be applied to the same version of the policy. **Important:** If you use IAM Conditions, you must include the `etag` field whenever you call `setIamPolicy`. If you omit this field, then IAM allows you to overwrite a version `3` policy with a version `1` policy, and all of the conditions in the version `3` policy are lost.
+    &quot;version&quot;: 42, # Specifies the format of the policy. Valid values are `0`, `1`, and `3`. Requests that specify an invalid value are rejected. Any operation that affects conditional role bindings must specify version `3`. This requirement applies to the following operations: * Getting a policy that includes a conditional role binding * Adding a conditional role binding to a policy * Changing a conditional role binding in a policy * Removing any role binding, with or without a condition, from a policy that includes conditions **Important:** If you use IAM Conditions, you must include the `etag` field whenever you call `setIamPolicy`. If you omit this field, then IAM allows you to overwrite a version `3` policy with a version `1` policy, and all of the conditions in the version `3` policy are lost. If a policy does not include any conditions, operations on that policy may specify any valid version or leave the field unset. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
+  },
+  &quot;updateMask&quot;: &quot;A String&quot;, # OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only the fields in the mask will be modified. If no mask is provided, the following default mask is used: `paths: &quot;bindings, etag&quot;`
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Identity and Access Management (IAM) policy, which specifies access controls for Google Cloud resources. A `Policy` is a collection of `bindings`. A `binding` binds one or more `members` to a single `role`. Members can be user accounts, service accounts, Google groups, and domains (such as G Suite). A `role` is a named list of permissions; each `role` can be an IAM predefined role or a user-created custom role. For some types of Google Cloud resources, a `binding` can also specify a `condition`, which is a logical expression that allows access to a resource only if the expression evaluates to `true`. A condition can add constraints based on attributes of the request, the resource, or both. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies). **JSON example:** { &quot;bindings&quot;: [ { &quot;role&quot;: &quot;roles/resourcemanager.organizationAdmin&quot;, &quot;members&quot;: [ &quot;user:mike@example.com&quot;, &quot;group:admins@example.com&quot;, &quot;domain:google.com&quot;, &quot;serviceAccount:my-project-id@appspot.gserviceaccount.com&quot; ] }, { &quot;role&quot;: &quot;roles/resourcemanager.organizationViewer&quot;, &quot;members&quot;: [ &quot;user:eve@example.com&quot; ], &quot;condition&quot;: { &quot;title&quot;: &quot;expirable access&quot;, &quot;description&quot;: &quot;Does not grant access after Sep 2020&quot;, &quot;expression&quot;: &quot;request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;)&quot;, } } ], &quot;etag&quot;: &quot;BwWWja0YfJA=&quot;, &quot;version&quot;: 3 } **YAML example:** bindings: - members: - user:mike@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-project-id@appspot.gserviceaccount.com role: roles/resourcemanager.organizationAdmin - members: - user:eve@example.com role: roles/resourcemanager.organizationViewer condition: title: expirable access description: Does not grant access after Sep 2020 expression: request.time &lt; timestamp(&#x27;2020-10-01T00:00:00.000Z&#x27;) - etag: BwWWja0YfJA= - version: 3 For a description of IAM and its features, see the [IAM documentation](https://cloud.google.com/iam/docs/).
+  &quot;auditConfigs&quot;: [ # Specifies cloud audit logging configuration for this policy.
+    { # Specifies the audit configuration for a service. The configuration determines which permission types are logged, and what identities, if any, are exempted from logging. An AuditConfig must have one or more AuditLogConfigs. If there are AuditConfigs for both `allServices` and a specific service, the union of the two AuditConfigs is used for that service: the log_types specified in each AuditConfig are enabled, and the exempted_members in each AuditLogConfig are exempted. Example Policy with multiple AuditConfigs: { &quot;audit_configs&quot;: [ { &quot;service&quot;: &quot;allServices&quot;, &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot;, &quot;exempted_members&quot;: [ &quot;user:jose@example.com&quot; ] }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot; }, { &quot;log_type&quot;: &quot;ADMIN_READ&quot; } ] }, { &quot;service&quot;: &quot;sampleservice.googleapis.com&quot;, &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot; }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot;, &quot;exempted_members&quot;: [ &quot;user:aliya@example.com&quot; ] } ] } ] } For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ logging. It also exempts jose@example.com from DATA_READ logging, and aliya@example.com from DATA_WRITE logging.
+      &quot;auditLogConfigs&quot;: [ # The configuration for logging of each type of permission.
+        { # Provides the configuration for logging a type of permissions. Example: { &quot;audit_log_configs&quot;: [ { &quot;log_type&quot;: &quot;DATA_READ&quot;, &quot;exempted_members&quot;: [ &quot;user:jose@example.com&quot; ] }, { &quot;log_type&quot;: &quot;DATA_WRITE&quot; } ] } This enables &#x27;DATA_READ&#x27; and &#x27;DATA_WRITE&#x27; logging, while exempting jose@example.com from DATA_READ logging.
+          &quot;exemptedMembers&quot;: [ # Specifies the identities that do not cause logging for this type of permission. Follows the same format of Binding.members.
+            &quot;A String&quot;,
+          ],
+          &quot;logType&quot;: &quot;A String&quot;, # The log type that this config enables.
+        },
+      ],
+      &quot;service&quot;: &quot;A String&quot;, # Specifies a service that will be enabled for audit logging. For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. `allServices` is a special value that covers all services.
+    },
+  ],
+  &quot;bindings&quot;: [ # Associates a list of `members` to a `role`. Optionally, may specify a `condition` that determines how and when the `bindings` are applied. Each of the `bindings` must contain at least one member.
+    { # Associates `members` with a `role`.
+      &quot;condition&quot;: { # Represents a textual expression in the Common Expression Language (CEL) syntax. CEL is a C-like expression language. The syntax and semantics of CEL are documented at https://github.com/google/cel-spec. Example (Comparison): title: &quot;Summary size limit&quot; description: &quot;Determines if a summary is less than 100 chars&quot; expression: &quot;document.summary.size() &lt; 100&quot; Example (Equality): title: &quot;Requestor is owner&quot; description: &quot;Determines if requestor is the document owner&quot; expression: &quot;document.owner == request.auth.claims.email&quot; Example (Logic): title: &quot;Public documents&quot; description: &quot;Determine whether the document should be publicly visible&quot; expression: &quot;document.type != &#x27;private&#x27; &amp;&amp; document.type != &#x27;internal&#x27;&quot; Example (Data Manipulation): title: &quot;Notification string&quot; description: &quot;Create a notification string with a timestamp.&quot; expression: &quot;&#x27;New message received at &#x27; + string(document.create_time)&quot; The exact variables and functions that may be referenced within an expression are determined by the service that evaluates it. See the service documentation for additional information. # The condition that is associated with this binding. If the condition evaluates to `true`, then this binding applies to the current request. If the condition evaluates to `false`, then this binding does not apply to the current request. However, a different role binding might grant the same role to one or more of the members in this binding. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
+        &quot;description&quot;: &quot;A String&quot;, # Optional. Description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI.
+        &quot;expression&quot;: &quot;A String&quot;, # Textual representation of an expression in Common Expression Language syntax.
+        &quot;location&quot;: &quot;A String&quot;, # Optional. String indicating the location of the expression for error reporting, e.g. a file name and a position in the file.
+        &quot;title&quot;: &quot;A String&quot;, # Optional. Title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression.
+      },
+      &quot;members&quot;: [ # Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values: * `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account. * `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account. * `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@example.com` . * `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`. * `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`. * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a user that has been recently deleted. For example, `alice@example.com?uid=123456789012345678901`. If the user is recovered, this value reverts to `user:{emailid}` and the recovered user retains the role in the binding. * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a service account that has been recently deleted. For example, `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`. If the service account is undeleted, this value reverts to `serviceAccount:{emailid}` and the undeleted service account retains the role in the binding. * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique identifier) representing a Google group that has been recently deleted. For example, `admins@example.com?uid=123456789012345678901`. If the group is recovered, this value reverts to `group:{emailid}` and the recovered group retains the role in the binding. * `domain:{domain}`: The G Suite domain (primary) that represents all the users of that domain. For example, `google.com` or `example.com`.
+        &quot;A String&quot;,
+      ],
+      &quot;role&quot;: &quot;A String&quot;, # Role that is assigned to `members`. For example, `roles/viewer`, `roles/editor`, or `roles/owner`.
+    },
+  ],
+  &quot;etag&quot;: &quot;A String&quot;, # `etag` is used for optimistic concurrency control as a way to help prevent simultaneous updates of a policy from overwriting each other. It is strongly suggested that systems make use of the `etag` in the read-modify-write cycle to perform policy updates in order to avoid race conditions: An `etag` is returned in the response to `getIamPolicy`, and systems are expected to put that etag in the request to `setIamPolicy` to ensure that their change will be applied to the same version of the policy. **Important:** If you use IAM Conditions, you must include the `etag` field whenever you call `setIamPolicy`. If you omit this field, then IAM allows you to overwrite a version `3` policy with a version `1` policy, and all of the conditions in the version `3` policy are lost.
+  &quot;version&quot;: 42, # Specifies the format of the policy. Valid values are `0`, `1`, and `3`. Requests that specify an invalid value are rejected. Any operation that affects conditional role bindings must specify version `3`. This requirement applies to the following operations: * Getting a policy that includes a conditional role binding * Adding a conditional role binding to a policy * Changing a conditional role binding in a policy * Removing any role binding, with or without a condition, from a policy that includes conditions **Important:** If you use IAM Conditions, you must include the `etag` field whenever you call `setIamPolicy`. If you omit this field, then IAM allows you to overwrite a version `3` policy with a version `1` policy, and all of the conditions in the version `3` policy are lost. If a policy does not include any conditions, operations on that policy may specify any valid version or leave the field unset. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="testIamPermissions">testIamPermissions(resource, body=None, x__xgafv=None)</code>
+  <pre>Returns permissions that a caller has on the specified resource. If the resource does not exist, this will return an empty set of permissions, not a `NOT_FOUND` error. Note: This operation is designed to be used for building permission-aware UIs and command-line tools, not for authorization checking. This operation may &quot;fail open&quot; without warning.
+
+Args:
+  resource: string, REQUIRED: The resource for which the policy detail is being requested. See the operation documentation for the appropriate value for this field. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for `TestIamPermissions` method.
+  &quot;permissions&quot;: [ # The set of permissions to check for the `resource`. Permissions with wildcards (such as &#x27;*&#x27; or &#x27;storage.*&#x27;) are not allowed. For more information see [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).
+    &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:
+
+    { # Response message for `TestIamPermissions` method.
+  &quot;permissions&quot;: [ # A subset of `TestPermissionsRequest.permissions` that the caller is allowed.
+    &quot;A String&quot;,
+  ],
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/eventarc_v1.projects.locations.html b/docs/dyn/eventarc_v1.projects.locations.html
index 2566e20..0682b9f 100644
--- a/docs/dyn/eventarc_v1.projects.locations.html
+++ b/docs/dyn/eventarc_v1.projects.locations.html
@@ -75,6 +75,11 @@
 <h1><a href="eventarc_v1.html">Eventarc API</a> . <a href="eventarc_v1.projects.html">projects</a> . <a href="eventarc_v1.projects.locations.html">locations</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
+  <code><a href="eventarc_v1.projects.locations.channels.html">channels()</a></code>
+</p>
+<p class="firstline">Returns the channels Resource.</p>
+
+<p class="toc_element">
   <code><a href="eventarc_v1.projects.locations.operations.html">operations()</a></code>
 </p>
 <p class="firstline">Returns the operations Resource.</p>
diff --git a/docs/dyn/file_v1beta1.projects.locations.instances.html b/docs/dyn/file_v1beta1.projects.locations.instances.html
index 5d40ef3..ff2a367 100644
--- a/docs/dyn/file_v1beta1.projects.locations.instances.html
+++ b/docs/dyn/file_v1beta1.projects.locations.instances.html
@@ -75,6 +75,11 @@
 <h1><a href="file_v1beta1.html">Cloud Filestore API</a> . <a href="file_v1beta1.projects.html">projects</a> . <a href="file_v1beta1.projects.locations.html">locations</a> . <a href="file_v1beta1.projects.locations.instances.html">instances</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
+  <code><a href="file_v1beta1.projects.locations.instances.snapshots.html">snapshots()</a></code>
+</p>
+<p class="firstline">Returns the snapshots 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">
@@ -149,7 +154,7 @@
         &quot;A String&quot;,
       ],
       &quot;network&quot;: &quot;A String&quot;, # The name of the Google Compute Engine [VPC network](/compute/docs/networks-and-firewalls#networks) to which the instance is connected.
-      &quot;reservedIpRange&quot;: &quot;A String&quot;, # A /29 CIDR block for Basic or a /23 CIDR block for High Scale in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can&#x27;t overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.
+      &quot;reservedIpRange&quot;: &quot;A String&quot;, # Optional, reserved_ip_range can have one of the following two types of values. * CIDR range value when using DIRECT_PEERING connect mode. * [Named Address Range](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address) when using PRIVATE_SERVICE_ACCESS connect mode. For both cases, the range value (direct CIDR value or the range value with which the named range was created) must be a /29 CIDR block for Basic tier or a /23 CIDR block for High Scale or Enterprise tier in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can&#x27;t overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.
     },
   ],
   &quot;satisfiesPzs&quot;: True or False, # Output only. Reserved for future use.
@@ -273,7 +278,7 @@
         &quot;A String&quot;,
       ],
       &quot;network&quot;: &quot;A String&quot;, # The name of the Google Compute Engine [VPC network](/compute/docs/networks-and-firewalls#networks) to which the instance is connected.
-      &quot;reservedIpRange&quot;: &quot;A String&quot;, # A /29 CIDR block for Basic or a /23 CIDR block for High Scale in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can&#x27;t overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.
+      &quot;reservedIpRange&quot;: &quot;A String&quot;, # Optional, reserved_ip_range can have one of the following two types of values. * CIDR range value when using DIRECT_PEERING connect mode. * [Named Address Range](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address) when using PRIVATE_SERVICE_ACCESS connect mode. For both cases, the range value (direct CIDR value or the range value with which the named range was created) must be a /29 CIDR block for Basic tier or a /23 CIDR block for High Scale or Enterprise tier in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can&#x27;t overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.
     },
   ],
   &quot;satisfiesPzs&quot;: True or False, # Output only. Reserved for future use.
@@ -339,7 +344,7 @@
             &quot;A String&quot;,
           ],
           &quot;network&quot;: &quot;A String&quot;, # The name of the Google Compute Engine [VPC network](/compute/docs/networks-and-firewalls#networks) to which the instance is connected.
-          &quot;reservedIpRange&quot;: &quot;A String&quot;, # A /29 CIDR block for Basic or a /23 CIDR block for High Scale in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can&#x27;t overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.
+          &quot;reservedIpRange&quot;: &quot;A String&quot;, # Optional, reserved_ip_range can have one of the following two types of values. * CIDR range value when using DIRECT_PEERING connect mode. * [Named Address Range](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address) when using PRIVATE_SERVICE_ACCESS connect mode. For both cases, the range value (direct CIDR value or the range value with which the named range was created) must be a /29 CIDR block for Basic tier or a /23 CIDR block for High Scale or Enterprise tier in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can&#x27;t overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.
         },
       ],
       &quot;satisfiesPzs&quot;: True or False, # Output only. Reserved for future use.
@@ -414,7 +419,7 @@
         &quot;A String&quot;,
       ],
       &quot;network&quot;: &quot;A String&quot;, # The name of the Google Compute Engine [VPC network](/compute/docs/networks-and-firewalls#networks) to which the instance is connected.
-      &quot;reservedIpRange&quot;: &quot;A String&quot;, # A /29 CIDR block for Basic or a /23 CIDR block for High Scale in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can&#x27;t overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.
+      &quot;reservedIpRange&quot;: &quot;A String&quot;, # Optional, reserved_ip_range can have one of the following two types of values. * CIDR range value when using DIRECT_PEERING connect mode. * [Named Address Range](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address) when using PRIVATE_SERVICE_ACCESS connect mode. For both cases, the range value (direct CIDR value or the range value with which the named range was created) must be a /29 CIDR block for Basic tier or a /23 CIDR block for High Scale or Enterprise tier in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can&#x27;t overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.
     },
   ],
   &quot;satisfiesPzs&quot;: True or False, # Output only. Reserved for future use.
diff --git a/docs/dyn/file_v1beta1.projects.locations.instances.snapshots.html b/docs/dyn/file_v1beta1.projects.locations.instances.snapshots.html
new file mode 100644
index 0000000..9d0459f
--- /dev/null
+++ b/docs/dyn/file_v1beta1.projects.locations.instances.snapshots.html
@@ -0,0 +1,314 @@
+<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="file_v1beta1.html">Cloud Filestore API</a> . <a href="file_v1beta1.projects.html">projects</a> . <a href="file_v1beta1.projects.locations.html">locations</a> . <a href="file_v1beta1.projects.locations.instances.html">instances</a> . <a href="file_v1beta1.projects.locations.instances.snapshots.html">snapshots</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, snapshotId=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a snapshot.</p>
+<p class="toc_element">
+  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes a snapshot.</p>
+<p class="toc_element">
+  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Gets the details of a specific snapshot.</p>
+<p class="toc_element">
+  <code><a href="#list">list(parent, filter=None, orderBy=None, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists all snapshots in a project for either a specified location or for all locations.</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="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates the settings of a specific snapshot.</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, snapshotId=None, x__xgafv=None)</code>
+  <pre>Creates a snapshot.
+
+Args:
+  parent: string, Required. The Filestore Instance to create the snapshots of, in the format projects/{project_id}/locations/{location}/instances/{instance_id} (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A Cloud Filestore snapshot.
+  &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the snapshot was created.
+  &quot;description&quot;: &quot;A String&quot;, # A description of the snapshot with 2048 characters or less. Requests with longer descriptions will be rejected.
+  &quot;filesystemUsedBytes&quot;: &quot;A String&quot;, # Output only. The amount of bytes needed to allocate a full copy of the snapshot content
+  &quot;labels&quot;: { # Resource labels to represent user provided metadata.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the snapshot, in the format projects/{project_id}/locations/{location_id}/instances/{instance_id}/snapshots/{snapshot_id}.
+  &quot;state&quot;: &quot;A String&quot;, # Output only. The snapshot state.
+}
+
+  snapshotId: string, Required. The ID to use for the snapshot. The ID must be unique within the specified instance. This value must start with a lowercase letter followed by up to 62 lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
+  <pre>Deletes a snapshot.
+
+Args:
+  name: string, Required. The snapshot resource name, in the format projects/{project_id}/locations/{location}/instances/{instance_id}/snapshots/{snapshot_id} (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(name, x__xgafv=None)</code>
+  <pre>Gets the details of a specific snapshot.
+
+Args:
+  name: string, Required. The snapshot resource name, in the format projects/{project_id}/locations/{location}/instances/{instance_id}/snapshots/{snapshot_id} (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A Cloud Filestore snapshot.
+  &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the snapshot was created.
+  &quot;description&quot;: &quot;A String&quot;, # A description of the snapshot with 2048 characters or less. Requests with longer descriptions will be rejected.
+  &quot;filesystemUsedBytes&quot;: &quot;A String&quot;, # Output only. The amount of bytes needed to allocate a full copy of the snapshot content
+  &quot;labels&quot;: { # Resource labels to represent user provided metadata.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the snapshot, in the format projects/{project_id}/locations/{location_id}/instances/{instance_id}/snapshots/{snapshot_id}.
+  &quot;state&quot;: &quot;A String&quot;, # Output only. The snapshot state.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(parent, filter=None, orderBy=None, pageSize=None, pageToken=None, x__xgafv=None)</code>
+  <pre>Lists all snapshots in a project for either a specified location or for all locations.
+
+Args:
+  parent: string, Required. The instance for which to retrieve snapshot information, in the format projects/{project_id}/locations/{location}/instances/{instance_id}. (required)
+  filter: string, List filter.
+  orderBy: string, Sort results. Supported values are &quot;name&quot;, &quot;name desc&quot; or &quot;&quot; (unsorted).
+  pageSize: integer, The maximum number of items to return.
+  pageToken: string, The next_page_token value to use if there are additional results to retrieve for this list request.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # ListSnapshotsResponse is the result of ListSnapshotsRequest.
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # The token you can use to retrieve the next page of results. Not returned if there are no more results in the list.
+  &quot;snapshots&quot;: [ # A list of snapshots in the project for the specified instance.
+    { # A Cloud Filestore snapshot.
+      &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the snapshot was created.
+      &quot;description&quot;: &quot;A String&quot;, # A description of the snapshot with 2048 characters or less. Requests with longer descriptions will be rejected.
+      &quot;filesystemUsedBytes&quot;: &quot;A String&quot;, # Output only. The amount of bytes needed to allocate a full copy of the snapshot content
+      &quot;labels&quot;: { # Resource labels to represent user provided metadata.
+        &quot;a_key&quot;: &quot;A String&quot;,
+      },
+      &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the snapshot, in the format projects/{project_id}/locations/{location_id}/instances/{instance_id}/snapshots/{snapshot_id}.
+      &quot;state&quot;: &quot;A String&quot;, # Output only. The snapshot state.
+    },
+  ],
+}</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="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
+  <pre>Updates the settings of a specific snapshot.
+
+Args:
+  name: string, Output only. The resource name of the snapshot, in the format projects/{project_id}/locations/{location_id}/instances/{instance_id}/snapshots/{snapshot_id}. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A Cloud Filestore snapshot.
+  &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the snapshot was created.
+  &quot;description&quot;: &quot;A String&quot;, # A description of the snapshot with 2048 characters or less. Requests with longer descriptions will be rejected.
+  &quot;filesystemUsedBytes&quot;: &quot;A String&quot;, # Output only. The amount of bytes needed to allocate a full copy of the snapshot content
+  &quot;labels&quot;: { # Resource labels to represent user provided metadata.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the snapshot, in the format projects/{project_id}/locations/{location_id}/instances/{instance_id}/snapshots/{snapshot_id}.
+  &quot;state&quot;: &quot;A String&quot;, # Output only. The snapshot state.
+}
+
+  updateMask: string, Required. Mask of fields to update. At least one path must be supplied in this field.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/firestore_v1.projects.databases.documents.html b/docs/dyn/firestore_v1.projects.databases.documents.html
index 02464f5..5887319 100644
--- a/docs/dyn/firestore_v1.projects.databases.documents.html
+++ b/docs/dyn/firestore_v1.projects.databases.documents.html
@@ -175,11 +175,7 @@
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
     &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
       &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-        &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-          &quot;values&quot;: [ # Values in the array.
-            # Object with schema name: Value
-          ],
-        },
+        &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
         &quot;booleanValue&quot;: True or False, # A boolean value.
         &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
         &quot;doubleValue&quot;: 3.14, # A double value.
@@ -234,16 +230,31 @@
           { # A transformation of a field of the document.
             &quot;appendMissingElements&quot;: { # An array value. # Append the given elements in order if they are not already present in the current field value. If the field is not an array, or if the field does not yet exist, it is first set to the empty array. Equivalent numbers of different types (e.g. 3L and 3.0) are considered equal when checking if a value is missing. NaN is equal to NaN, and Null is equal to Null. If the input contains multiple equivalent values, only the first will be considered. The corresponding transform_result will be the null value.
               &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
+                { # A message that can hold any of the supported value types.
+                  &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                  &quot;booleanValue&quot;: True or False, # A boolean value.
+                  &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                  &quot;doubleValue&quot;: 3.14, # A double value.
+                  &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                    &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                    &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                  },
+                  &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                  &quot;mapValue&quot;: { # A map value. # A map value.
+                    &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                      &quot;a_key&quot;: # Object with schema name: Value
+                    },
+                  },
+                  &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                  &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                  &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                  &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+                },
               ],
             },
             &quot;fieldPath&quot;: &quot;A String&quot;, # The path of the field. See Document.fields for the field path syntax reference.
             &quot;increment&quot;: { # A message that can hold any of the supported value types. # Adds the given value to the field&#x27;s current value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If either of the given value or the current field value are doubles, both values will be interpreted as doubles. Double arithmetic and representation of double values follow IEEE 754 semantics. If there is positive/negative integer overflow, the field is resolved to the largest magnitude positive/negative integer.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -263,11 +274,7 @@
               &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
             },
             &quot;maximum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the maximum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If a maximum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the larger operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and zero input value is always the stored value. The maximum of any numeric value x and NaN is NaN.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -287,11 +294,7 @@
               &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
             },
             &quot;minimum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the minimum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the input value. If a minimum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the smaller operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and zero input value is always the stored value. The minimum of any numeric value x and NaN is NaN.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -312,7 +315,26 @@
             },
             &quot;removeAllFromArray&quot;: { # An array value. # Remove all of the given elements from the array in the field. If the field is not an array, or if the field does not yet exist, it is set to the empty array. Equivalent numbers of the different types (e.g. 3L and 3.0) are considered equal when deciding whether an element should be removed. NaN is equal to NaN, and Null is equal to Null. This will remove all equivalent values if there are duplicates. The corresponding transform_result will be the null value.
               &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
+                { # A message that can hold any of the supported value types.
+                  &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                  &quot;booleanValue&quot;: True or False, # A boolean value.
+                  &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                  &quot;doubleValue&quot;: 3.14, # A double value.
+                  &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                    &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                    &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                  },
+                  &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                  &quot;mapValue&quot;: { # A map value. # A map value.
+                    &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                      &quot;a_key&quot;: # Object with schema name: Value
+                    },
+                  },
+                  &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                  &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                  &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                  &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+                },
               ],
             },
             &quot;setToServerValue&quot;: &quot;A String&quot;, # Sets the field to the given server value.
@@ -323,11 +345,7 @@
         &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
         &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
           &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -359,16 +377,31 @@
         { # A transformation of a field of the document.
           &quot;appendMissingElements&quot;: { # An array value. # Append the given elements in order if they are not already present in the current field value. If the field is not an array, or if the field does not yet exist, it is first set to the empty array. Equivalent numbers of different types (e.g. 3L and 3.0) are considered equal when checking if a value is missing. NaN is equal to NaN, and Null is equal to Null. If the input contains multiple equivalent values, only the first will be considered. The corresponding transform_result will be the null value.
             &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
+              { # A message that can hold any of the supported value types.
+                &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                &quot;booleanValue&quot;: True or False, # A boolean value.
+                &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                &quot;doubleValue&quot;: 3.14, # A double value.
+                &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                  &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                  &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                },
+                &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                &quot;mapValue&quot;: { # A map value. # A map value.
+                  &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                    &quot;a_key&quot;: # Object with schema name: Value
+                  },
+                },
+                &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+              },
             ],
           },
           &quot;fieldPath&quot;: &quot;A String&quot;, # The path of the field. See Document.fields for the field path syntax reference.
           &quot;increment&quot;: { # A message that can hold any of the supported value types. # Adds the given value to the field&#x27;s current value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If either of the given value or the current field value are doubles, both values will be interpreted as doubles. Double arithmetic and representation of double values follow IEEE 754 semantics. If there is positive/negative integer overflow, the field is resolved to the largest magnitude positive/negative integer.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -388,11 +421,7 @@
             &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
           },
           &quot;maximum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the maximum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If a maximum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the larger operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and zero input value is always the stored value. The maximum of any numeric value x and NaN is NaN.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -412,11 +441,7 @@
             &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
           },
           &quot;minimum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the minimum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the input value. If a minimum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the smaller operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and zero input value is always the stored value. The minimum of any numeric value x and NaN is NaN.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -437,7 +462,26 @@
           },
           &quot;removeAllFromArray&quot;: { # An array value. # Remove all of the given elements from the array in the field. If the field is not an array, or if the field does not yet exist, it is set to the empty array. Equivalent numbers of the different types (e.g. 3L and 3.0) are considered equal when deciding whether an element should be removed. NaN is equal to NaN, and Null is equal to Null. This will remove all equivalent values if there are duplicates. The corresponding transform_result will be the null value.
             &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
+              { # A message that can hold any of the supported value types.
+                &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                &quot;booleanValue&quot;: True or False, # A boolean value.
+                &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                &quot;doubleValue&quot;: 3.14, # A double value.
+                &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                  &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                  &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                },
+                &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                &quot;mapValue&quot;: { # A map value. # A map value.
+                  &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                    &quot;a_key&quot;: # Object with schema name: Value
+                  },
+                },
+                &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+              },
             ],
           },
           &quot;setToServerValue&quot;: &quot;A String&quot;, # Sets the field to the given server value.
@@ -471,11 +515,7 @@
     { # The result of applying a write.
       &quot;transformResults&quot;: [ # The results of applying each DocumentTransform.FieldTransform, in the same order.
         { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -563,16 +603,31 @@
           { # A transformation of a field of the document.
             &quot;appendMissingElements&quot;: { # An array value. # Append the given elements in order if they are not already present in the current field value. If the field is not an array, or if the field does not yet exist, it is first set to the empty array. Equivalent numbers of different types (e.g. 3L and 3.0) are considered equal when checking if a value is missing. NaN is equal to NaN, and Null is equal to Null. If the input contains multiple equivalent values, only the first will be considered. The corresponding transform_result will be the null value.
               &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
+                { # A message that can hold any of the supported value types.
+                  &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                  &quot;booleanValue&quot;: True or False, # A boolean value.
+                  &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                  &quot;doubleValue&quot;: 3.14, # A double value.
+                  &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                    &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                    &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                  },
+                  &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                  &quot;mapValue&quot;: { # A map value. # A map value.
+                    &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                      &quot;a_key&quot;: # Object with schema name: Value
+                    },
+                  },
+                  &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                  &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                  &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                  &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+                },
               ],
             },
             &quot;fieldPath&quot;: &quot;A String&quot;, # The path of the field. See Document.fields for the field path syntax reference.
             &quot;increment&quot;: { # A message that can hold any of the supported value types. # Adds the given value to the field&#x27;s current value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If either of the given value or the current field value are doubles, both values will be interpreted as doubles. Double arithmetic and representation of double values follow IEEE 754 semantics. If there is positive/negative integer overflow, the field is resolved to the largest magnitude positive/negative integer.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -592,11 +647,7 @@
               &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
             },
             &quot;maximum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the maximum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If a maximum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the larger operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and zero input value is always the stored value. The maximum of any numeric value x and NaN is NaN.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -616,11 +667,7 @@
               &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
             },
             &quot;minimum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the minimum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the input value. If a minimum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the smaller operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and zero input value is always the stored value. The minimum of any numeric value x and NaN is NaN.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -641,7 +688,26 @@
             },
             &quot;removeAllFromArray&quot;: { # An array value. # Remove all of the given elements from the array in the field. If the field is not an array, or if the field does not yet exist, it is set to the empty array. Equivalent numbers of the different types (e.g. 3L and 3.0) are considered equal when deciding whether an element should be removed. NaN is equal to NaN, and Null is equal to Null. This will remove all equivalent values if there are duplicates. The corresponding transform_result will be the null value.
               &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
+                { # A message that can hold any of the supported value types.
+                  &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                  &quot;booleanValue&quot;: True or False, # A boolean value.
+                  &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                  &quot;doubleValue&quot;: 3.14, # A double value.
+                  &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                    &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                    &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                  },
+                  &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                  &quot;mapValue&quot;: { # A map value. # A map value.
+                    &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                      &quot;a_key&quot;: # Object with schema name: Value
+                    },
+                  },
+                  &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                  &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                  &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                  &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+                },
               ],
             },
             &quot;setToServerValue&quot;: &quot;A String&quot;, # Sets the field to the given server value.
@@ -652,11 +718,7 @@
         &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
         &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
           &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -688,16 +750,31 @@
         { # A transformation of a field of the document.
           &quot;appendMissingElements&quot;: { # An array value. # Append the given elements in order if they are not already present in the current field value. If the field is not an array, or if the field does not yet exist, it is first set to the empty array. Equivalent numbers of different types (e.g. 3L and 3.0) are considered equal when checking if a value is missing. NaN is equal to NaN, and Null is equal to Null. If the input contains multiple equivalent values, only the first will be considered. The corresponding transform_result will be the null value.
             &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
+              { # A message that can hold any of the supported value types.
+                &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                &quot;booleanValue&quot;: True or False, # A boolean value.
+                &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                &quot;doubleValue&quot;: 3.14, # A double value.
+                &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                  &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                  &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                },
+                &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                &quot;mapValue&quot;: { # A map value. # A map value.
+                  &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                    &quot;a_key&quot;: # Object with schema name: Value
+                  },
+                },
+                &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+              },
             ],
           },
           &quot;fieldPath&quot;: &quot;A String&quot;, # The path of the field. See Document.fields for the field path syntax reference.
           &quot;increment&quot;: { # A message that can hold any of the supported value types. # Adds the given value to the field&#x27;s current value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If either of the given value or the current field value are doubles, both values will be interpreted as doubles. Double arithmetic and representation of double values follow IEEE 754 semantics. If there is positive/negative integer overflow, the field is resolved to the largest magnitude positive/negative integer.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -717,11 +794,7 @@
             &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
           },
           &quot;maximum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the maximum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If a maximum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the larger operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and zero input value is always the stored value. The maximum of any numeric value x and NaN is NaN.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -741,11 +814,7 @@
             &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
           },
           &quot;minimum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the minimum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the input value. If a minimum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the smaller operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and zero input value is always the stored value. The minimum of any numeric value x and NaN is NaN.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -766,7 +835,26 @@
           },
           &quot;removeAllFromArray&quot;: { # An array value. # Remove all of the given elements from the array in the field. If the field is not an array, or if the field does not yet exist, it is set to the empty array. Equivalent numbers of the different types (e.g. 3L and 3.0) are considered equal when deciding whether an element should be removed. NaN is equal to NaN, and Null is equal to Null. This will remove all equivalent values if there are duplicates. The corresponding transform_result will be the null value.
             &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
+              { # A message that can hold any of the supported value types.
+                &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                &quot;booleanValue&quot;: True or False, # A boolean value.
+                &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                &quot;doubleValue&quot;: 3.14, # A double value.
+                &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                  &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                  &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                },
+                &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                &quot;mapValue&quot;: { # A map value. # A map value.
+                  &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                    &quot;a_key&quot;: # Object with schema name: Value
+                  },
+                },
+                &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+              },
             ],
           },
           &quot;setToServerValue&quot;: &quot;A String&quot;, # Sets the field to the given server value.
@@ -790,11 +878,7 @@
     { # The result of applying a write.
       &quot;transformResults&quot;: [ # The results of applying each DocumentTransform.FieldTransform, in the same order.
         { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -834,11 +918,7 @@
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
   &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
     &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-      &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-        &quot;values&quot;: [ # Values in the array.
-          # Object with schema name: Value
-        ],
-      },
+      &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
       &quot;booleanValue&quot;: True or False, # A boolean value.
       &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
       &quot;doubleValue&quot;: 3.14, # A double value.
@@ -876,11 +956,7 @@
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
   &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
     &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-      &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-        &quot;values&quot;: [ # Values in the array.
-          # Object with schema name: Value
-        ],
-      },
+      &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
       &quot;booleanValue&quot;: True or False, # A boolean value.
       &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
       &quot;doubleValue&quot;: 3.14, # A double value.
@@ -946,11 +1022,7 @@
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
   &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
     &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-      &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-        &quot;values&quot;: [ # Values in the array.
-          # Object with schema name: Value
-        ],
-      },
+      &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
       &quot;booleanValue&quot;: True or False, # A boolean value.
       &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
       &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1003,11 +1075,7 @@
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
       &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
         &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1117,11 +1185,7 @@
           &quot;before&quot;: True or False, # If the position is just before or just after the given values, relative to the sort order defined by the query.
           &quot;values&quot;: [ # The values that represent a position, in the order they appear in the order by clause of a query. Can contain fewer values than specified in the order by clause.
             { # A message that can hold any of the supported value types.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1169,11 +1233,7 @@
           &quot;before&quot;: True or False, # If the position is just before or just after the given values, relative to the sort order defined by the query.
           &quot;values&quot;: [ # The values that represent a position, in the order they appear in the order by clause of a query. Can contain fewer values than specified in the order by clause.
             { # A message that can hold any of the supported value types.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1207,11 +1267,7 @@
             },
             &quot;op&quot;: &quot;A String&quot;, # The operator to filter by.
             &quot;value&quot;: { # A message that can hold any of the supported value types. # The value to compare to.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1264,11 +1320,7 @@
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
       &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
         &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1354,11 +1406,7 @@
       &quot;before&quot;: True or False, # If the position is just before or just after the given values, relative to the sort order defined by the query.
       &quot;values&quot;: [ # The values that represent a position, in the order they appear in the order by clause of a query. Can contain fewer values than specified in the order by clause.
         { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1406,11 +1454,7 @@
       &quot;before&quot;: True or False, # If the position is just before or just after the given values, relative to the sort order defined by the query.
       &quot;values&quot;: [ # The values that represent a position, in the order they appear in the order by clause of a query. Can contain fewer values than specified in the order by clause.
         { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1444,11 +1488,7 @@
         },
         &quot;op&quot;: &quot;A String&quot;, # The operator to filter by.
         &quot;value&quot;: { # A message that can hold any of the supported value types. # The value to compare to.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1493,11 +1533,7 @@
       &quot;before&quot;: True or False, # If the position is just before or just after the given values, relative to the sort order defined by the query.
       &quot;values&quot;: [ # The values that represent a position, in the order they appear in the order by clause of a query. Can contain fewer values than specified in the order by clause.
         { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1549,11 +1585,7 @@
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
   &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
     &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-      &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-        &quot;values&quot;: [ # Values in the array.
-          # Object with schema name: Value
-        ],
-      },
+      &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
       &quot;booleanValue&quot;: True or False, # A boolean value.
       &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
       &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1593,11 +1625,7 @@
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
   &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
     &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-      &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-        &quot;values&quot;: [ # Values in the array.
-          # Object with schema name: Value
-        ],
-      },
+      &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
       &quot;booleanValue&quot;: True or False, # A boolean value.
       &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
       &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1671,11 +1699,7 @@
       &quot;before&quot;: True or False, # If the position is just before or just after the given values, relative to the sort order defined by the query.
       &quot;values&quot;: [ # The values that represent a position, in the order they appear in the order by clause of a query. Can contain fewer values than specified in the order by clause.
         { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1723,11 +1747,7 @@
       &quot;before&quot;: True or False, # If the position is just before or just after the given values, relative to the sort order defined by the query.
       &quot;values&quot;: [ # The values that represent a position, in the order they appear in the order by clause of a query. Can contain fewer values than specified in the order by clause.
         { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1761,11 +1781,7 @@
         },
         &quot;op&quot;: &quot;A String&quot;, # The operator to filter by.
         &quot;value&quot;: { # A message that can hold any of the supported value types. # The value to compare to.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1809,11 +1825,7 @@
     &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
     &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
       &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-        &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-          &quot;values&quot;: [ # Values in the array.
-            # Object with schema name: Value
-          ],
-        },
+        &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
         &quot;booleanValue&quot;: True or False, # A boolean value.
         &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
         &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1870,16 +1882,31 @@
           { # A transformation of a field of the document.
             &quot;appendMissingElements&quot;: { # An array value. # Append the given elements in order if they are not already present in the current field value. If the field is not an array, or if the field does not yet exist, it is first set to the empty array. Equivalent numbers of different types (e.g. 3L and 3.0) are considered equal when checking if a value is missing. NaN is equal to NaN, and Null is equal to Null. If the input contains multiple equivalent values, only the first will be considered. The corresponding transform_result will be the null value.
               &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
+                { # A message that can hold any of the supported value types.
+                  &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                  &quot;booleanValue&quot;: True or False, # A boolean value.
+                  &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                  &quot;doubleValue&quot;: 3.14, # A double value.
+                  &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                    &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                    &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                  },
+                  &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                  &quot;mapValue&quot;: { # A map value. # A map value.
+                    &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                      &quot;a_key&quot;: # Object with schema name: Value
+                    },
+                  },
+                  &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                  &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                  &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                  &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+                },
               ],
             },
             &quot;fieldPath&quot;: &quot;A String&quot;, # The path of the field. See Document.fields for the field path syntax reference.
             &quot;increment&quot;: { # A message that can hold any of the supported value types. # Adds the given value to the field&#x27;s current value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If either of the given value or the current field value are doubles, both values will be interpreted as doubles. Double arithmetic and representation of double values follow IEEE 754 semantics. If there is positive/negative integer overflow, the field is resolved to the largest magnitude positive/negative integer.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1899,11 +1926,7 @@
               &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
             },
             &quot;maximum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the maximum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If a maximum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the larger operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and zero input value is always the stored value. The maximum of any numeric value x and NaN is NaN.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1923,11 +1946,7 @@
               &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
             },
             &quot;minimum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the minimum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the input value. If a minimum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the smaller operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and zero input value is always the stored value. The minimum of any numeric value x and NaN is NaN.
-              &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-                &quot;values&quot;: [ # Values in the array.
-                  # Object with schema name: Value
-                ],
-              },
+              &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
               &quot;booleanValue&quot;: True or False, # A boolean value.
               &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
               &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1948,7 +1967,26 @@
             },
             &quot;removeAllFromArray&quot;: { # An array value. # Remove all of the given elements from the array in the field. If the field is not an array, or if the field does not yet exist, it is set to the empty array. Equivalent numbers of the different types (e.g. 3L and 3.0) are considered equal when deciding whether an element should be removed. NaN is equal to NaN, and Null is equal to Null. This will remove all equivalent values if there are duplicates. The corresponding transform_result will be the null value.
               &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
+                { # A message that can hold any of the supported value types.
+                  &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                  &quot;booleanValue&quot;: True or False, # A boolean value.
+                  &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                  &quot;doubleValue&quot;: 3.14, # A double value.
+                  &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                    &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                    &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                  },
+                  &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                  &quot;mapValue&quot;: { # A map value. # A map value.
+                    &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                      &quot;a_key&quot;: # Object with schema name: Value
+                    },
+                  },
+                  &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                  &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                  &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                  &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+                },
               ],
             },
             &quot;setToServerValue&quot;: &quot;A String&quot;, # Sets the field to the given server value.
@@ -1959,11 +1997,7 @@
         &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time at which the document was created. This value increases monotonically when a document is deleted then recreated. It can also be compared to values from other documents and the `read_time` of a query.
         &quot;fields&quot;: { # The document&#x27;s fields. The map keys represent field names. A simple field name contains only characters `a` to `z`, `A` to `Z`, `0` to `9`, or `_`, and must not start with `0` to `9`. For example, `foo_bar_17`. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty. Field paths may be used in other contexts to refer to structured fields defined here. For `map_value`, the field path is represented by the simple or quoted field names of the containing fields, delimited by `.`. For example, the structured field `&quot;foo&quot; : { map_value: { &quot;x&amp;y&quot; : { string_value: &quot;hello&quot; }}}` would be represented by the field path `foo.x&amp;y`. Within a field path, a quoted field name starts and ends with `` ` `` and may contain any character. Some characters, including `` ` ``, must be escaped using a `\`. For example, `` `x&amp;y` `` represents `x&amp;y` and `` `bak\`tik` `` represents `` bak`tik ``.
           &quot;a_key&quot;: { # A message that can hold any of the supported value types.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -1995,16 +2029,31 @@
         { # A transformation of a field of the document.
           &quot;appendMissingElements&quot;: { # An array value. # Append the given elements in order if they are not already present in the current field value. If the field is not an array, or if the field does not yet exist, it is first set to the empty array. Equivalent numbers of different types (e.g. 3L and 3.0) are considered equal when checking if a value is missing. NaN is equal to NaN, and Null is equal to Null. If the input contains multiple equivalent values, only the first will be considered. The corresponding transform_result will be the null value.
             &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
+              { # A message that can hold any of the supported value types.
+                &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                &quot;booleanValue&quot;: True or False, # A boolean value.
+                &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                &quot;doubleValue&quot;: 3.14, # A double value.
+                &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                  &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                  &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                },
+                &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                &quot;mapValue&quot;: { # A map value. # A map value.
+                  &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                    &quot;a_key&quot;: # Object with schema name: Value
+                  },
+                },
+                &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+              },
             ],
           },
           &quot;fieldPath&quot;: &quot;A String&quot;, # The path of the field. See Document.fields for the field path syntax reference.
           &quot;increment&quot;: { # A message that can hold any of the supported value types. # Adds the given value to the field&#x27;s current value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If either of the given value or the current field value are doubles, both values will be interpreted as doubles. Double arithmetic and representation of double values follow IEEE 754 semantics. If there is positive/negative integer overflow, the field is resolved to the largest magnitude positive/negative integer.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -2024,11 +2073,7 @@
             &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
           },
           &quot;maximum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the maximum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the given value. If a maximum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the larger operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and zero input value is always the stored value. The maximum of any numeric value x and NaN is NaN.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -2048,11 +2093,7 @@
             &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
           },
           &quot;minimum&quot;: { # A message that can hold any of the supported value types. # Sets the field to the minimum of its current value and the given value. This must be an integer or a double value. If the field is not an integer or double, or if the field does not yet exist, the transformation will set the field to the input value. If a minimum operation is applied where the field and the input value are of mixed types (that is - one is an integer and one is a double) the field takes on the type of the smaller operand. If the operands are equivalent (e.g. 3 and 3.0), the field does not change. 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and zero input value is always the stored value. The minimum of any numeric value x and NaN is NaN.
-            &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-              &quot;values&quot;: [ # Values in the array.
-                # Object with schema name: Value
-              ],
-            },
+            &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
             &quot;booleanValue&quot;: True or False, # A boolean value.
             &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
             &quot;doubleValue&quot;: 3.14, # A double value.
@@ -2073,7 +2114,26 @@
           },
           &quot;removeAllFromArray&quot;: { # An array value. # Remove all of the given elements from the array in the field. If the field is not an array, or if the field does not yet exist, it is set to the empty array. Equivalent numbers of the different types (e.g. 3L and 3.0) are considered equal when deciding whether an element should be removed. NaN is equal to NaN, and Null is equal to Null. This will remove all equivalent values if there are duplicates. The corresponding transform_result will be the null value.
             &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
+              { # A message that can hold any of the supported value types.
+                &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
+                &quot;booleanValue&quot;: True or False, # A boolean value.
+                &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
+                &quot;doubleValue&quot;: 3.14, # A double value.
+                &quot;geoPointValue&quot;: { # An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges. # A geo point value representing a point on the surface of Earth.
+                  &quot;latitude&quot;: 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
+                  &quot;longitude&quot;: 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
+                },
+                &quot;integerValue&quot;: &quot;A String&quot;, # An integer value.
+                &quot;mapValue&quot;: { # A map value. # A map value.
+                  &quot;fields&quot;: { # The map&#x27;s fields. The map keys represent field names. Field names matching the regular expression `__.*__` are reserved. Reserved field names are forbidden except in certain documented contexts. The map keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be empty.
+                    &quot;a_key&quot;: # Object with schema name: Value
+                  },
+                },
+                &quot;nullValue&quot;: &quot;A String&quot;, # A null value.
+                &quot;referenceValue&quot;: &quot;A String&quot;, # A reference to a document. For example: `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+                &quot;stringValue&quot;: &quot;A String&quot;, # A string value. The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes of the UTF-8 representation are considered by queries.
+                &quot;timestampValue&quot;: &quot;A String&quot;, # A timestamp value. Precise only to microseconds. When stored, any additional precision is rounded down.
+              },
             ],
           },
           &quot;setToServerValue&quot;: &quot;A String&quot;, # Sets the field to the given server value.
@@ -2099,11 +2159,7 @@
     { # The result of applying a write.
       &quot;transformResults&quot;: [ # The results of applying each DocumentTransform.FieldTransform, in the same order.
         { # A message that can hold any of the supported value types.
-          &quot;arrayValue&quot;: { # An array value. # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
-            &quot;values&quot;: [ # Values in the array.
-              # Object with schema name: Value
-            ],
-          },
+          &quot;arrayValue&quot;: # Object with schema name: ArrayValue # An array value. Cannot directly contain another array value, though can contain an map which contains another array.
           &quot;booleanValue&quot;: True or False, # A boolean value.
           &quot;bytesValue&quot;: &quot;A String&quot;, # A bytes value. Must not exceed 1 MiB - 89 bytes. Only the first 1,500 bytes are considered by queries.
           &quot;doubleValue&quot;: 3.14, # A double value.
diff --git a/docs/dyn/healthcare_v1beta1.projects.locations.services.nlp.html b/docs/dyn/healthcare_v1beta1.projects.locations.services.nlp.html
index 5ec9bfc..4894920 100644
--- a/docs/dyn/healthcare_v1beta1.projects.locations.services.nlp.html
+++ b/docs/dyn/healthcare_v1beta1.projects.locations.services.nlp.html
@@ -76,14 +76,14 @@
 <h2>Instance Methods</h2>
 <p class="toc_element">
   <code><a href="#analyzeEntities">analyzeEntities(nlpService, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Analyze heathcare entity in a document. Its response includes the recognized entity mentions and the relationships between them. AnalyzeEntities uses context aware models to detect entities.</p>
+<p class="firstline">Analyze heathcare entity in a document. Its response includes the recognized entity mentions and the relationships between them. AnalyzeEntities uses context aware models to detect entities. This method can only analyze documents written in English.</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="analyzeEntities">analyzeEntities(nlpService, body=None, x__xgafv=None)</code>
-  <pre>Analyze heathcare entity in a document. Its response includes the recognized entity mentions and the relationships between them. AnalyzeEntities uses context aware models to detect entities.
+  <pre>Analyze heathcare entity in a document. Its response includes the recognized entity mentions and the relationships between them. AnalyzeEntities uses context aware models to detect entities. This method can only analyze documents written in English.
 
 Args:
   nlpService: string, The resource name of the service of the form: &quot;projects/{project_id}/locations/{location_id}/services/nlp&quot;. (required)
diff --git a/docs/dyn/index.md b/docs/dyn/index.md
index 6d9671f..f951e82 100644
--- a/docs/dyn/index.md
+++ b/docs/dyn/index.md
@@ -771,12 +771,6 @@
 * [v1beta1](http://googleapis.github.io/google-api-python-client/docs/dyn/redis_v1beta1.html)
 
 
-## remotebuildexecution
-* [v1](http://googleapis.github.io/google-api-python-client/docs/dyn/remotebuildexecution_v1.html)
-* [v1alpha](http://googleapis.github.io/google-api-python-client/docs/dyn/remotebuildexecution_v1alpha.html)
-* [v2](http://googleapis.github.io/google-api-python-client/docs/dyn/remotebuildexecution_v2.html)
-
-
 ## reseller
 * [v1](http://googleapis.github.io/google-api-python-client/docs/dyn/reseller_v1.html)
 
@@ -961,7 +955,6 @@
 
 ## verifiedaccess
 * [v1](http://googleapis.github.io/google-api-python-client/docs/dyn/verifiedaccess_v1.html)
-* [v2](http://googleapis.github.io/google-api-python-client/docs/dyn/verifiedaccess_v2.html)
 
 
 ## videointelligence
diff --git a/docs/dyn/monitoring_v1.html b/docs/dyn/monitoring_v1.html
index 7b97a7b..cd59069 100644
--- a/docs/dyn/monitoring_v1.html
+++ b/docs/dyn/monitoring_v1.html
@@ -75,6 +75,11 @@
 <h1><a href="monitoring_v1.html">Cloud Monitoring API</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
+  <code><a href="monitoring_v1.locations.html">locations()</a></code>
+</p>
+<p class="firstline">Returns the locations Resource.</p>
+
+<p class="toc_element">
   <code><a href="monitoring_v1.operations.html">operations()</a></code>
 </p>
 <p class="firstline">Returns the operations Resource.</p>
diff --git a/docs/dyn/monitoring_v1.locations.global_.html b/docs/dyn/monitoring_v1.locations.global_.html
new file mode 100644
index 0000000..b52054d
--- /dev/null
+++ b/docs/dyn/monitoring_v1.locations.global_.html
@@ -0,0 +1,91 @@
+<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="monitoring_v1.html">Cloud Monitoring API</a> . <a href="monitoring_v1.locations.html">locations</a> . <a href="monitoring_v1.locations.global_.html">global_</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="monitoring_v1.locations.global_.metricsScopes.html">metricsScopes()</a></code>
+</p>
+<p class="firstline">Returns the metricsScopes 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/monitoring_v1.locations.global_.metricsScopes.html b/docs/dyn/monitoring_v1.locations.global_.metricsScopes.html
new file mode 100644
index 0000000..8c35e5c
--- /dev/null
+++ b/docs/dyn/monitoring_v1.locations.global_.metricsScopes.html
@@ -0,0 +1,155 @@
+<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="monitoring_v1.html">Cloud Monitoring API</a> . <a href="monitoring_v1.locations.html">locations</a> . <a href="monitoring_v1.locations.global_.html">global_</a> . <a href="monitoring_v1.locations.global_.metricsScopes.html">metricsScopes</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="monitoring_v1.locations.global_.metricsScopes.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="#get">get(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns a specific Metrics Scope.</p>
+<p class="toc_element">
+  <code><a href="#listMetricScopesByMonitoredProject">listMetricScopesByMonitoredProject(monitoredResourceContainer=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns a list of every Metrics Scope that a specific MonitoredProject has been added to. The metrics scope representing the specified monitored project will always be the first entry in the response.</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="get">get(name, x__xgafv=None)</code>
+  <pre>Returns a specific Metrics Scope.
+
+Args:
+  name: string, Required. The resource name of the Metrics Scope. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER} (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Represents a Metrics Scope (https://cloud.google.com/monitoring/settings#concept-scope) in Cloud Monitoring, which specifies one or more Google projects and zero or more AWS accounts to monitor together.
+  &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when this Metrics Scope was created.
+  &quot;monitoredProjects&quot;: [ # Output only. The list of projects monitored by this Metrics Scope.
+    { # A project being monitored (https://cloud.google.com/monitoring/settings/multiple-projects#create-multi) by a Metrics Scope.
+      &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when this MonitoredProject was created.
+      &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name of the MonitoredProject. On input, the resource name includes the scoping project ID and monitored project ID. On output, it contains the equivalent project numbers. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}/projects/{MONITORED_PROJECT_ID_OR_NUMBER}
+    },
+  ],
+  &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name of the Monitoring Metrics Scope. On input, the resource name can be specified with the scoping project ID or number. On output, the resource name is specified with the scoping project number. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}
+  &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time when this Metrics Scope record was last updated.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="listMetricScopesByMonitoredProject">listMetricScopesByMonitoredProject(monitoredResourceContainer=None, x__xgafv=None)</code>
+  <pre>Returns a list of every Metrics Scope that a specific MonitoredProject has been added to. The metrics scope representing the specified monitored project will always be the first entry in the response.
+
+Args:
+  monitoredResourceContainer: string, Required. The resource name of the Monitored Project being requested. Example: projects/{MONITORED_PROJECT_ID_OR_NUMBER}
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response for the ListMetricsScopesByMonitoredProject method.
+  &quot;metricsScopes&quot;: [ # A set of all metrics scopes that the specified monitored project has been added to.
+    { # Represents a Metrics Scope (https://cloud.google.com/monitoring/settings#concept-scope) in Cloud Monitoring, which specifies one or more Google projects and zero or more AWS accounts to monitor together.
+      &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when this Metrics Scope was created.
+      &quot;monitoredProjects&quot;: [ # Output only. The list of projects monitored by this Metrics Scope.
+        { # A project being monitored (https://cloud.google.com/monitoring/settings/multiple-projects#create-multi) by a Metrics Scope.
+          &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when this MonitoredProject was created.
+          &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name of the MonitoredProject. On input, the resource name includes the scoping project ID and monitored project ID. On output, it contains the equivalent project numbers. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}/projects/{MONITORED_PROJECT_ID_OR_NUMBER}
+        },
+      ],
+      &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name of the Monitoring Metrics Scope. On input, the resource name can be specified with the scoping project ID or number. On output, the resource name is specified with the scoping project number. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}
+      &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time when this Metrics Scope record was last updated.
+    },
+  ],
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/monitoring_v1.locations.global_.metricsScopes.projects.html b/docs/dyn/monitoring_v1.locations.global_.metricsScopes.projects.html
new file mode 100644
index 0000000..5f27340
--- /dev/null
+++ b/docs/dyn/monitoring_v1.locations.global_.metricsScopes.projects.html
@@ -0,0 +1,170 @@
+<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="monitoring_v1.html">Cloud Monitoring API</a> . <a href="monitoring_v1.locations.html">locations</a> . <a href="monitoring_v1.locations.global_.html">global_</a> . <a href="monitoring_v1.locations.global_.metricsScopes.html">metricsScopes</a> . <a href="monitoring_v1.locations.global_.metricsScopes.projects.html">projects</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">Adds a MonitoredProject with the given project ID to the specified Metrics Scope.</p>
+<p class="toc_element">
+  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes a MonitoredProject from the specified Metrics Scope.</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>Adds a MonitoredProject with the given project ID to the specified Metrics Scope.
+
+Args:
+  parent: string, Required. The resource name of the existing Metrics Scope that will monitor this project. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER} (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A project being monitored (https://cloud.google.com/monitoring/settings/multiple-projects#create-multi) by a Metrics Scope.
+  &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when this MonitoredProject was created.
+  &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name of the MonitoredProject. On input, the resource name includes the scoping project ID and monitored project ID. On output, it contains the equivalent project numbers. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}/projects/{MONITORED_PROJECT_ID_OR_NUMBER}
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is false, it means the operation is still in progress. If true, the operation is completed, and either error or response is available.
+  &quot;error&quot;: { # The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC (https://github.com/grpc). Each Status message contains three pieces of data: error code, error message, and error details.You can find out more about this error model and how to work with it in the API Design Guide (https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the name should be a resource name ending with operations/{unique_id}.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as Delete, the response is google.protobuf.Empty. If the original method is standard Get/Create/Update, the response should be the resource. For other methods, the response should have the type XxxResponse, where Xxx is the original method name. For example, if the original method name is TakeSnapshot(), the inferred response type is TakeSnapshotResponse.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
+  <pre>Deletes a MonitoredProject from the specified Metrics Scope.
+
+Args:
+  name: string, Required. The resource name of the MonitoredProject. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}/projects/{MONITORED_PROJECT_ID_OR_NUMBER}Authorization requires the following Google IAM (https://cloud.google.com/iam) permissions on both the Metrics Scope and on the MonitoredProject: monitoring.metricsScopes.link (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is false, it means the operation is still in progress. If true, the operation is completed, and either error or response is available.
+  &quot;error&quot;: { # The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC (https://github.com/grpc). Each Status message contains three pieces of data: error code, error message, and error details.You can find out more about this error model and how to work with it in the API Design Guide (https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the name should be a resource name ending with operations/{unique_id}.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as Delete, the response is google.protobuf.Empty. If the original method is standard Get/Create/Update, the response should be the resource. For other methods, the response should have the type XxxResponse, where Xxx is the original method name. For example, if the original method name is TakeSnapshot(), the inferred response type is TakeSnapshotResponse.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/monitoring_v1.locations.html b/docs/dyn/monitoring_v1.locations.html
new file mode 100644
index 0000000..e808e64
--- /dev/null
+++ b/docs/dyn/monitoring_v1.locations.html
@@ -0,0 +1,91 @@
+<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="monitoring_v1.html">Cloud Monitoring API</a> . <a href="monitoring_v1.locations.html">locations</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="monitoring_v1.locations.global_.html">global_()</a></code>
+</p>
+<p class="firstline">Returns the global_ 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/monitoring_v3.services.serviceLevelObjectives.html b/docs/dyn/monitoring_v3.services.serviceLevelObjectives.html
index bc05437..053603f 100644
--- a/docs/dyn/monitoring_v3.services.serviceLevelObjectives.html
+++ b/docs/dyn/monitoring_v3.services.serviceLevelObjectives.html
@@ -134,9 +134,9 @@
       ],
     },
     &quot;requestBased&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # Request-based SLIs
-      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
         &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -167,9 +167,9 @@
           ],
         },
         &quot;performance&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # RequestBasedSli to evaluate to judge window quality.
-          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
             &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-            &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+            &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
               &quot;max&quot;: 3.14, # Range maximum.
               &quot;min&quot;: 3.14, # Range minimum.
             },
@@ -182,15 +182,15 @@
         },
         &quot;threshold&quot;: 3.14, # If window performance &gt;= threshold, the window is counted as good.
       },
-      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
         &quot;timeSeries&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying the TimeSeries to use for evaluating window quality.
       },
-      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -237,9 +237,9 @@
       ],
     },
     &quot;requestBased&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # Request-based SLIs
-      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
         &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -270,9 +270,9 @@
           ],
         },
         &quot;performance&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # RequestBasedSli to evaluate to judge window quality.
-          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
             &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-            &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+            &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
               &quot;max&quot;: 3.14, # Range maximum.
               &quot;min&quot;: 3.14, # Range minimum.
             },
@@ -285,15 +285,15 @@
         },
         &quot;threshold&quot;: 3.14, # If window performance &gt;= threshold, the window is counted as good.
       },
-      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
         &quot;timeSeries&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying the TimeSeries to use for evaluating window quality.
       },
-      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -369,9 +369,9 @@
       ],
     },
     &quot;requestBased&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # Request-based SLIs
-      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
         &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -402,9 +402,9 @@
           ],
         },
         &quot;performance&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # RequestBasedSli to evaluate to judge window quality.
-          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
             &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-            &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+            &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
               &quot;max&quot;: 3.14, # Range maximum.
               &quot;min&quot;: 3.14, # Range minimum.
             },
@@ -417,15 +417,15 @@
         },
         &quot;threshold&quot;: 3.14, # If window performance &gt;= threshold, the window is counted as good.
       },
-      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
         &quot;timeSeries&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying the TimeSeries to use for evaluating window quality.
       },
-      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -489,9 +489,9 @@
           ],
         },
         &quot;requestBased&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # Request-based SLIs
-          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
             &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-            &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+            &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
               &quot;max&quot;: 3.14, # Range maximum.
               &quot;min&quot;: 3.14, # Range minimum.
             },
@@ -522,9 +522,9 @@
               ],
             },
             &quot;performance&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # RequestBasedSli to evaluate to judge window quality.
-              &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+              &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
                 &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-                &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+                &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
                   &quot;max&quot;: 3.14, # Range maximum.
                   &quot;min&quot;: 3.14, # Range minimum.
                 },
@@ -537,15 +537,15 @@
             },
             &quot;threshold&quot;: 3.14, # If window performance &gt;= threshold, the window is counted as good.
           },
-          &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
-            &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+          &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
+            &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
               &quot;max&quot;: 3.14, # Range maximum.
               &quot;min&quot;: 3.14, # Range minimum.
             },
             &quot;timeSeries&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying the TimeSeries to use for evaluating window quality.
           },
-          &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
-            &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+          &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
+            &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
               &quot;max&quot;: 3.14, # Range maximum.
               &quot;min&quot;: 3.14, # Range minimum.
             },
@@ -609,9 +609,9 @@
       ],
     },
     &quot;requestBased&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # Request-based SLIs
-      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
         &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -642,9 +642,9 @@
           ],
         },
         &quot;performance&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # RequestBasedSli to evaluate to judge window quality.
-          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
             &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-            &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+            &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
               &quot;max&quot;: 3.14, # Range maximum.
               &quot;min&quot;: 3.14, # Range minimum.
             },
@@ -657,15 +657,15 @@
         },
         &quot;threshold&quot;: 3.14, # If window performance &gt;= threshold, the window is counted as good.
       },
-      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
         &quot;timeSeries&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying the TimeSeries to use for evaluating window quality.
       },
-      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -712,9 +712,9 @@
       ],
     },
     &quot;requestBased&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # Request-based SLIs
-      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+      &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
         &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
@@ -745,9 +745,9 @@
           ],
         },
         &quot;performance&quot;: { # Service Level Indicators for which atomic units of service are counted directly. # RequestBasedSli to evaluate to judge window quality.
-          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min &lt;= x &lt; range.max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
+          &quot;distributionCut&quot;: { # A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max. # distribution_cut is used when good_service is a count of values aggregated in a Distribution that fall into a good range. The total_service is the total count of all values aggregated in the Distribution.
             &quot;distributionFilter&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying a TimeSeries aggregating values. Must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE.
-            &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+            &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
               &quot;max&quot;: 3.14, # Range maximum.
               &quot;min&quot;: 3.14, # Range minimum.
             },
@@ -760,15 +760,15 @@
         },
         &quot;threshold&quot;: 3.14, # If window performance &gt;= threshold, the window is counted as good.
       },
-      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricMeanInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, averaged across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
         &quot;timeSeries&quot;: &quot;A String&quot;, # A monitoring filter (https://cloud.google.com/monitoring/api/v3/filters) specifying the TimeSeries to use for evaluating window quality.
       },
-      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt; range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
-        &quot;range&quot;: { # Range of numerical values, inclusive of min and exclusive of max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
+      &quot;metricSumInRange&quot;: { # A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min &lt;= x &lt;= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE. # A window is good if the metric&#x27;s value is in a good range, summed across returned streams.
+        &quot;range&quot;: { # Range of numerical values within min and max. If the open range &quot;&lt; range.max&quot; is desired, set range.min = -infinity. If the open range &quot;&gt;= range.min&quot; is desired, set range.max = infinity. # Range of values considered &quot;good.&quot; For a one-sided range, set one bound to an infinite value.
           &quot;max&quot;: 3.14, # Range maximum.
           &quot;min&quot;: 3.14, # Range minimum.
         },
diff --git a/docs/dyn/mybusinessnotifications_v1.accounts.html b/docs/dyn/mybusinessnotifications_v1.accounts.html
index a27641b..9e5f8ff 100644
--- a/docs/dyn/mybusinessnotifications_v1.accounts.html
+++ b/docs/dyn/mybusinessnotifications_v1.accounts.html
@@ -104,7 +104,7 @@
   An object of the form:
 
     { # A Google Pub/Sub topic where notifications can be published when a location is updated or has a new review. There will be only one notification setting resource per-account.
-  &quot;name&quot;: &quot;A String&quot;, # Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notifications/setting`.
+  &quot;name&quot;: &quot;A String&quot;, # Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notificationSetting`.
   &quot;notificationTypes&quot;: [ # The types of notifications that will be sent to the Pub/Sub topic. To stop receiving notifications entirely, use NotificationSettings.UpdateNotificationSetting with an empty notification_types or set the pubsub_topic to an empty string.
     &quot;A String&quot;,
   ],
@@ -117,12 +117,12 @@
   <pre>Sets the pubsub notification setting for the account informing Google which topic to send pubsub notifications for. Use the notification_types field within notification_setting to manipulate the events an account wants to subscribe to. An account will only have one notification setting resource, and only one pubsub topic can be set. To delete the setting, update with an empty notification_types
 
 Args:
-  name: string, Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notifications/setting`. (required)
+  name: string, Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notificationSetting`. (required)
   body: object, The request body.
     The object takes the form of:
 
 { # A Google Pub/Sub topic where notifications can be published when a location is updated or has a new review. There will be only one notification setting resource per-account.
-  &quot;name&quot;: &quot;A String&quot;, # Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notifications/setting`.
+  &quot;name&quot;: &quot;A String&quot;, # Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notificationSetting`.
   &quot;notificationTypes&quot;: [ # The types of notifications that will be sent to the Pub/Sub topic. To stop receiving notifications entirely, use NotificationSettings.UpdateNotificationSetting with an empty notification_types or set the pubsub_topic to an empty string.
     &quot;A String&quot;,
   ],
@@ -139,7 +139,7 @@
   An object of the form:
 
     { # A Google Pub/Sub topic where notifications can be published when a location is updated or has a new review. There will be only one notification setting resource per-account.
-  &quot;name&quot;: &quot;A String&quot;, # Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notifications/setting`.
+  &quot;name&quot;: &quot;A String&quot;, # Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notificationSetting`.
   &quot;notificationTypes&quot;: [ # The types of notifications that will be sent to the Pub/Sub topic. To stop receiving notifications entirely, use NotificationSettings.UpdateNotificationSetting with an empty notification_types or set the pubsub_topic to an empty string.
     &quot;A String&quot;,
   ],
diff --git a/docs/dyn/notebooks_v1.projects.locations.runtimes.html b/docs/dyn/notebooks_v1.projects.locations.runtimes.html
index 76c317a..2b478c4 100644
--- a/docs/dyn/notebooks_v1.projects.locations.runtimes.html
+++ b/docs/dyn/notebooks_v1.projects.locations.runtimes.html
@@ -135,8 +135,8 @@
       &quot;a_key&quot;: &quot;A String&quot;,
     },
   },
-  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the runtime. Format: `projects/{project}/locations/{location}/runtimes/{runtime}`
-  &quot;softwareConfig&quot;: { # Specifies the selection and config of software inside the runtime. / The properties to set on runtime. Properties keys are specified in `key:value` format, for example: * idle_shutdown: idle_shutdown=true * idle_shutdown_timeout: idle_shutdown_timeout=180 * report-system-health: report-system-health=true # The config settings for software inside the runtime.
+  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the runtime. Format: `projects/{project}/locations/{location}/runtimes/{runtimeId}`
+  &quot;softwareConfig&quot;: { # Specifies the selection and configuration of software inside the runtime. The properties to set on runtime. Properties keys are specified in `key:value` format, for example: * `idle_shutdown: true` * `idle_shutdown_timeout: 180` * `report-system-health: true` # The config settings for software inside the runtime.
     &quot;customGpuDriverPath&quot;: &quot;A String&quot;, # Specify a custom Cloud Storage path where the GPU driver is stored. If not specified, we&#x27;ll automatically choose from official GPU drivers.
     &quot;enableHealthMonitoring&quot;: True or False, # Verifies core internal services are running. Default: True
     &quot;idleShutdown&quot;: True or False, # Runtime will automatically shutdown after idle_shutdown_time. Default: True
@@ -162,16 +162,16 @@
         },
       ],
       &quot;dataDisk&quot;: { # An Local attached disk resource. # Required. Data disk option configuration settings.
-        &quot;autoDelete&quot;: True or False, # Output only. Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance).
-        &quot;boot&quot;: True or False, # Output only. Indicates that this is a boot disk. The virtual machine will use the first partition of the disk for its root filesystem.
-        &quot;deviceName&quot;: &quot;A String&quot;, # Output only. Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disk-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks.
+        &quot;autoDelete&quot;: True or False, # Optional. Output only. Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance).
+        &quot;boot&quot;: True or False, # Optional. Output only. Indicates that this is a boot disk. The virtual machine will use the first partition of the disk for its root filesystem.
+        &quot;deviceName&quot;: &quot;A String&quot;, # Optional. Output only. Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disk-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks.
         &quot;guestOsFeatures&quot;: [ # Output only. Indicates a list of features to enable on the guest operating system. Applicable only for bootable images. Read Enabling guest operating system features to see a list of available options.
-          { # A list of features to enable on the guest operating system. Applicable only for bootable images. Read Enabling guest operating system features to see a list of available options. Guest OS features for boot disk.
-            &quot;type&quot;: &quot;A String&quot;, # The ID of a supported feature. Read Enabling guest operating system features to see a list of available options. Valid values: FEATURE_TYPE_UNSPECIFIED MULTI_IP_SUBNET SECURE_BOOT UEFI_COMPATIBLE VIRTIO_SCSI_MULTIQUEUE WINDOWS
+          { # Optional. A list of features to enable on the guest operating system. Applicable only for bootable images. Read [Enabling guest operating system features](https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features) to see a list of available options. Guest OS features for boot disk.
+            &quot;type&quot;: &quot;A String&quot;, # The ID of a supported feature. Read [Enabling guest operating system features](https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features) to see a list of available options. Valid values: * FEATURE_TYPE_UNSPECIFIED * MULTI_IP_SUBNET * SECURE_BOOT * UEFI_COMPATIBLE * VIRTIO_SCSI_MULTIQUEUE * WINDOWS
           },
         ],
-        &quot;index&quot;: 42, # Output only. [Output Only] A zero-based index to this disk, where 0 is reserved for the boot disk. If you have many disks attached to an instance, each disk would have a unique index number.
-        &quot;initializeParams&quot;: { # [Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new runtime. This property is mutually exclusive with the source property; you can only define one or the other, but not both. # Input only. [Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance. This property is mutually exclusive with the source property; you can only define one or the other, but not both.
+        &quot;index&quot;: 42, # Output only. A zero-based index to this disk, where 0 is reserved for the boot disk. If you have many disks attached to an instance, each disk would have a unique index number.
+        &quot;initializeParams&quot;: { # Input only. Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new runtime. This property is mutually exclusive with the source property; you can only define one or the other, but not both. # Input only. Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance. This property is mutually exclusive with the source property; you can only define one or the other, but not both.
           &quot;description&quot;: &quot;A String&quot;, # Optional. Provide this property when creating the disk.
           &quot;diskName&quot;: &quot;A String&quot;, # Optional. Specifies the disk name. If not specified, the default is to use the name of the instance. If the disk with the instance name exists already in the given zone/region, a new name will be automatically generated.
           &quot;diskSizeGb&quot;: &quot;A String&quot;, # Optional. Specifies the size of the disk in base-2 GB. If not specified, the disk will be the same size as the image (usually 10GB). If specified, the size must be equal to or larger than 10GB. Default 100 GB.
@@ -182,7 +182,7 @@
         },
         &quot;interface&quot;: &quot;A String&quot;, # Specifies the disk interface to use for attaching this disk, which is either SCSI or NVME. The default is SCSI. Persistent disks must always use SCSI and the request will fail if you attempt to attach a persistent disk in any other format than SCSI. Local SSDs can use either NVME or SCSI. For performance characteristics of SCSI over NVMe, see Local SSD performance. Valid values: NVME SCSI
         &quot;kind&quot;: &quot;A String&quot;, # Output only. Type of the resource. Always compute#attachedDisk for attached disks.
-        &quot;licenses&quot;: [ # Output only. [Output Only] Any valid publicly visible licenses.
+        &quot;licenses&quot;: [ # Output only. Any valid publicly visible licenses.
           &quot;A String&quot;,
         ],
         &quot;mode&quot;: &quot;A String&quot;, # The mode in which to attach this disk, either READ_WRITE or READ_ONLY. If not specified, the default is to attach the disk in READ_WRITE mode. Valid values: READ_ONLY READ_WRITE
@@ -205,7 +205,7 @@
       },
       &quot;network&quot;: &quot;A String&quot;, # Optional. The Compute Engine network to be used for machine communications. Cannot be specified with subnetwork. If neither `network` nor `subnet` is specified, the &quot;default&quot; network of the project is used, if it exists. A full URL or partial URI. Examples: * `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default` * `projects/[project_id]/regions/global/default` Runtimes are managed resources inside Google Infrastructure. Runtimes support the following network configurations: * Google Managed Network (Network &amp; subnet are empty) * Consumer Project VPC (network &amp; subnet are required). Requires configuring Private Service Access. * Shared VPC (network &amp; subnet are required). Requires configuring Private Service Access.
       &quot;nicType&quot;: &quot;A String&quot;, # Optional. The type of vNIC to be used on this interface. This may be gVNIC or VirtioNet.
-      &quot;shieldedInstanceConfig&quot;: { # A set of Shielded Instance options. Check [Images using supported Shielded VM features] Not all combinations are valid. # Optional. Shielded VM Instance configuration settings.
+      &quot;shieldedInstanceConfig&quot;: { # A set of Shielded Instance options. Check [Images using supported Shielded VM features](https://cloud.google.com/compute/docs/instances/modifying-shielded-vm). Not all combinations are valid. # Optional. Shielded VM Instance configuration settings.
         &quot;enableIntegrityMonitoring&quot;: True or False, # Defines whether the instance has integrity monitoring enabled. Enables monitoring and attestation of the boot integrity of the instance. The attestation is performed against the integrity policy baseline. This baseline is initially derived from the implicitly trusted boot image when the instance is created. Enabled by default.
         &quot;enableSecureBoot&quot;: True or False, # Defines whether the instance has Secure Boot enabled. Secure Boot helps ensure that the system only runs authentic software by verifying the digital signature of all boot components, and halting the boot process if signature verification fails. Disabled by default.
         &quot;enableVtpm&quot;: True or False, # Defines whether the instance has the vTPM enabled. Enabled by default.
@@ -311,8 +311,8 @@
       &quot;a_key&quot;: &quot;A String&quot;,
     },
   },
-  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the runtime. Format: `projects/{project}/locations/{location}/runtimes/{runtime}`
-  &quot;softwareConfig&quot;: { # Specifies the selection and config of software inside the runtime. / The properties to set on runtime. Properties keys are specified in `key:value` format, for example: * idle_shutdown: idle_shutdown=true * idle_shutdown_timeout: idle_shutdown_timeout=180 * report-system-health: report-system-health=true # The config settings for software inside the runtime.
+  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the runtime. Format: `projects/{project}/locations/{location}/runtimes/{runtimeId}`
+  &quot;softwareConfig&quot;: { # Specifies the selection and configuration of software inside the runtime. The properties to set on runtime. Properties keys are specified in `key:value` format, for example: * `idle_shutdown: true` * `idle_shutdown_timeout: 180` * `report-system-health: true` # The config settings for software inside the runtime.
     &quot;customGpuDriverPath&quot;: &quot;A String&quot;, # Specify a custom Cloud Storage path where the GPU driver is stored. If not specified, we&#x27;ll automatically choose from official GPU drivers.
     &quot;enableHealthMonitoring&quot;: True or False, # Verifies core internal services are running. Default: True
     &quot;idleShutdown&quot;: True or False, # Runtime will automatically shutdown after idle_shutdown_time. Default: True
@@ -338,16 +338,16 @@
         },
       ],
       &quot;dataDisk&quot;: { # An Local attached disk resource. # Required. Data disk option configuration settings.
-        &quot;autoDelete&quot;: True or False, # Output only. Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance).
-        &quot;boot&quot;: True or False, # Output only. Indicates that this is a boot disk. The virtual machine will use the first partition of the disk for its root filesystem.
-        &quot;deviceName&quot;: &quot;A String&quot;, # Output only. Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disk-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks.
+        &quot;autoDelete&quot;: True or False, # Optional. Output only. Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance).
+        &quot;boot&quot;: True or False, # Optional. Output only. Indicates that this is a boot disk. The virtual machine will use the first partition of the disk for its root filesystem.
+        &quot;deviceName&quot;: &quot;A String&quot;, # Optional. Output only. Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disk-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks.
         &quot;guestOsFeatures&quot;: [ # Output only. Indicates a list of features to enable on the guest operating system. Applicable only for bootable images. Read Enabling guest operating system features to see a list of available options.
-          { # A list of features to enable on the guest operating system. Applicable only for bootable images. Read Enabling guest operating system features to see a list of available options. Guest OS features for boot disk.
-            &quot;type&quot;: &quot;A String&quot;, # The ID of a supported feature. Read Enabling guest operating system features to see a list of available options. Valid values: FEATURE_TYPE_UNSPECIFIED MULTI_IP_SUBNET SECURE_BOOT UEFI_COMPATIBLE VIRTIO_SCSI_MULTIQUEUE WINDOWS
+          { # Optional. A list of features to enable on the guest operating system. Applicable only for bootable images. Read [Enabling guest operating system features](https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features) to see a list of available options. Guest OS features for boot disk.
+            &quot;type&quot;: &quot;A String&quot;, # The ID of a supported feature. Read [Enabling guest operating system features](https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features) to see a list of available options. Valid values: * FEATURE_TYPE_UNSPECIFIED * MULTI_IP_SUBNET * SECURE_BOOT * UEFI_COMPATIBLE * VIRTIO_SCSI_MULTIQUEUE * WINDOWS
           },
         ],
-        &quot;index&quot;: 42, # Output only. [Output Only] A zero-based index to this disk, where 0 is reserved for the boot disk. If you have many disks attached to an instance, each disk would have a unique index number.
-        &quot;initializeParams&quot;: { # [Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new runtime. This property is mutually exclusive with the source property; you can only define one or the other, but not both. # Input only. [Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance. This property is mutually exclusive with the source property; you can only define one or the other, but not both.
+        &quot;index&quot;: 42, # Output only. A zero-based index to this disk, where 0 is reserved for the boot disk. If you have many disks attached to an instance, each disk would have a unique index number.
+        &quot;initializeParams&quot;: { # Input only. Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new runtime. This property is mutually exclusive with the source property; you can only define one or the other, but not both. # Input only. Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance. This property is mutually exclusive with the source property; you can only define one or the other, but not both.
           &quot;description&quot;: &quot;A String&quot;, # Optional. Provide this property when creating the disk.
           &quot;diskName&quot;: &quot;A String&quot;, # Optional. Specifies the disk name. If not specified, the default is to use the name of the instance. If the disk with the instance name exists already in the given zone/region, a new name will be automatically generated.
           &quot;diskSizeGb&quot;: &quot;A String&quot;, # Optional. Specifies the size of the disk in base-2 GB. If not specified, the disk will be the same size as the image (usually 10GB). If specified, the size must be equal to or larger than 10GB. Default 100 GB.
@@ -358,7 +358,7 @@
         },
         &quot;interface&quot;: &quot;A String&quot;, # Specifies the disk interface to use for attaching this disk, which is either SCSI or NVME. The default is SCSI. Persistent disks must always use SCSI and the request will fail if you attempt to attach a persistent disk in any other format than SCSI. Local SSDs can use either NVME or SCSI. For performance characteristics of SCSI over NVMe, see Local SSD performance. Valid values: NVME SCSI
         &quot;kind&quot;: &quot;A String&quot;, # Output only. Type of the resource. Always compute#attachedDisk for attached disks.
-        &quot;licenses&quot;: [ # Output only. [Output Only] Any valid publicly visible licenses.
+        &quot;licenses&quot;: [ # Output only. Any valid publicly visible licenses.
           &quot;A String&quot;,
         ],
         &quot;mode&quot;: &quot;A String&quot;, # The mode in which to attach this disk, either READ_WRITE or READ_ONLY. If not specified, the default is to attach the disk in READ_WRITE mode. Valid values: READ_ONLY READ_WRITE
@@ -381,7 +381,7 @@
       },
       &quot;network&quot;: &quot;A String&quot;, # Optional. The Compute Engine network to be used for machine communications. Cannot be specified with subnetwork. If neither `network` nor `subnet` is specified, the &quot;default&quot; network of the project is used, if it exists. A full URL or partial URI. Examples: * `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default` * `projects/[project_id]/regions/global/default` Runtimes are managed resources inside Google Infrastructure. Runtimes support the following network configurations: * Google Managed Network (Network &amp; subnet are empty) * Consumer Project VPC (network &amp; subnet are required). Requires configuring Private Service Access. * Shared VPC (network &amp; subnet are required). Requires configuring Private Service Access.
       &quot;nicType&quot;: &quot;A String&quot;, # Optional. The type of vNIC to be used on this interface. This may be gVNIC or VirtioNet.
-      &quot;shieldedInstanceConfig&quot;: { # A set of Shielded Instance options. Check [Images using supported Shielded VM features] Not all combinations are valid. # Optional. Shielded VM Instance configuration settings.
+      &quot;shieldedInstanceConfig&quot;: { # A set of Shielded Instance options. Check [Images using supported Shielded VM features](https://cloud.google.com/compute/docs/instances/modifying-shielded-vm). Not all combinations are valid. # Optional. Shielded VM Instance configuration settings.
         &quot;enableIntegrityMonitoring&quot;: True or False, # Defines whether the instance has integrity monitoring enabled. Enables monitoring and attestation of the boot integrity of the instance. The attestation is performed against the integrity policy baseline. This baseline is initially derived from the implicitly trusted boot image when the instance is created. Enabled by default.
         &quot;enableSecureBoot&quot;: True or False, # Defines whether the instance has Secure Boot enabled. Secure Boot helps ensure that the system only runs authentic software by verifying the digital signature of all boot components, and halting the boot process if signature verification fails. Disabled by default.
         &quot;enableVtpm&quot;: True or False, # Defines whether the instance has the vTPM enabled. Enabled by default.
@@ -428,8 +428,8 @@
           &quot;a_key&quot;: &quot;A String&quot;,
         },
       },
-      &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the runtime. Format: `projects/{project}/locations/{location}/runtimes/{runtime}`
-      &quot;softwareConfig&quot;: { # Specifies the selection and config of software inside the runtime. / The properties to set on runtime. Properties keys are specified in `key:value` format, for example: * idle_shutdown: idle_shutdown=true * idle_shutdown_timeout: idle_shutdown_timeout=180 * report-system-health: report-system-health=true # The config settings for software inside the runtime.
+      &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the runtime. Format: `projects/{project}/locations/{location}/runtimes/{runtimeId}`
+      &quot;softwareConfig&quot;: { # Specifies the selection and configuration of software inside the runtime. The properties to set on runtime. Properties keys are specified in `key:value` format, for example: * `idle_shutdown: true` * `idle_shutdown_timeout: 180` * `report-system-health: true` # The config settings for software inside the runtime.
         &quot;customGpuDriverPath&quot;: &quot;A String&quot;, # Specify a custom Cloud Storage path where the GPU driver is stored. If not specified, we&#x27;ll automatically choose from official GPU drivers.
         &quot;enableHealthMonitoring&quot;: True or False, # Verifies core internal services are running. Default: True
         &quot;idleShutdown&quot;: True or False, # Runtime will automatically shutdown after idle_shutdown_time. Default: True
@@ -455,16 +455,16 @@
             },
           ],
           &quot;dataDisk&quot;: { # An Local attached disk resource. # Required. Data disk option configuration settings.
-            &quot;autoDelete&quot;: True or False, # Output only. Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance).
-            &quot;boot&quot;: True or False, # Output only. Indicates that this is a boot disk. The virtual machine will use the first partition of the disk for its root filesystem.
-            &quot;deviceName&quot;: &quot;A String&quot;, # Output only. Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disk-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks.
+            &quot;autoDelete&quot;: True or False, # Optional. Output only. Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance).
+            &quot;boot&quot;: True or False, # Optional. Output only. Indicates that this is a boot disk. The virtual machine will use the first partition of the disk for its root filesystem.
+            &quot;deviceName&quot;: &quot;A String&quot;, # Optional. Output only. Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disk-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks.
             &quot;guestOsFeatures&quot;: [ # Output only. Indicates a list of features to enable on the guest operating system. Applicable only for bootable images. Read Enabling guest operating system features to see a list of available options.
-              { # A list of features to enable on the guest operating system. Applicable only for bootable images. Read Enabling guest operating system features to see a list of available options. Guest OS features for boot disk.
-                &quot;type&quot;: &quot;A String&quot;, # The ID of a supported feature. Read Enabling guest operating system features to see a list of available options. Valid values: FEATURE_TYPE_UNSPECIFIED MULTI_IP_SUBNET SECURE_BOOT UEFI_COMPATIBLE VIRTIO_SCSI_MULTIQUEUE WINDOWS
+              { # Optional. A list of features to enable on the guest operating system. Applicable only for bootable images. Read [Enabling guest operating system features](https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features) to see a list of available options. Guest OS features for boot disk.
+                &quot;type&quot;: &quot;A String&quot;, # The ID of a supported feature. Read [Enabling guest operating system features](https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features) to see a list of available options. Valid values: * FEATURE_TYPE_UNSPECIFIED * MULTI_IP_SUBNET * SECURE_BOOT * UEFI_COMPATIBLE * VIRTIO_SCSI_MULTIQUEUE * WINDOWS
               },
             ],
-            &quot;index&quot;: 42, # Output only. [Output Only] A zero-based index to this disk, where 0 is reserved for the boot disk. If you have many disks attached to an instance, each disk would have a unique index number.
-            &quot;initializeParams&quot;: { # [Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new runtime. This property is mutually exclusive with the source property; you can only define one or the other, but not both. # Input only. [Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance. This property is mutually exclusive with the source property; you can only define one or the other, but not both.
+            &quot;index&quot;: 42, # Output only. A zero-based index to this disk, where 0 is reserved for the boot disk. If you have many disks attached to an instance, each disk would have a unique index number.
+            &quot;initializeParams&quot;: { # Input only. Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new runtime. This property is mutually exclusive with the source property; you can only define one or the other, but not both. # Input only. Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance. This property is mutually exclusive with the source property; you can only define one or the other, but not both.
               &quot;description&quot;: &quot;A String&quot;, # Optional. Provide this property when creating the disk.
               &quot;diskName&quot;: &quot;A String&quot;, # Optional. Specifies the disk name. If not specified, the default is to use the name of the instance. If the disk with the instance name exists already in the given zone/region, a new name will be automatically generated.
               &quot;diskSizeGb&quot;: &quot;A String&quot;, # Optional. Specifies the size of the disk in base-2 GB. If not specified, the disk will be the same size as the image (usually 10GB). If specified, the size must be equal to or larger than 10GB. Default 100 GB.
@@ -475,7 +475,7 @@
             },
             &quot;interface&quot;: &quot;A String&quot;, # Specifies the disk interface to use for attaching this disk, which is either SCSI or NVME. The default is SCSI. Persistent disks must always use SCSI and the request will fail if you attempt to attach a persistent disk in any other format than SCSI. Local SSDs can use either NVME or SCSI. For performance characteristics of SCSI over NVMe, see Local SSD performance. Valid values: NVME SCSI
             &quot;kind&quot;: &quot;A String&quot;, # Output only. Type of the resource. Always compute#attachedDisk for attached disks.
-            &quot;licenses&quot;: [ # Output only. [Output Only] Any valid publicly visible licenses.
+            &quot;licenses&quot;: [ # Output only. Any valid publicly visible licenses.
               &quot;A String&quot;,
             ],
             &quot;mode&quot;: &quot;A String&quot;, # The mode in which to attach this disk, either READ_WRITE or READ_ONLY. If not specified, the default is to attach the disk in READ_WRITE mode. Valid values: READ_ONLY READ_WRITE
@@ -498,7 +498,7 @@
           },
           &quot;network&quot;: &quot;A String&quot;, # Optional. The Compute Engine network to be used for machine communications. Cannot be specified with subnetwork. If neither `network` nor `subnet` is specified, the &quot;default&quot; network of the project is used, if it exists. A full URL or partial URI. Examples: * `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default` * `projects/[project_id]/regions/global/default` Runtimes are managed resources inside Google Infrastructure. Runtimes support the following network configurations: * Google Managed Network (Network &amp; subnet are empty) * Consumer Project VPC (network &amp; subnet are required). Requires configuring Private Service Access. * Shared VPC (network &amp; subnet are required). Requires configuring Private Service Access.
           &quot;nicType&quot;: &quot;A String&quot;, # Optional. The type of vNIC to be used on this interface. This may be gVNIC or VirtioNet.
-          &quot;shieldedInstanceConfig&quot;: { # A set of Shielded Instance options. Check [Images using supported Shielded VM features] Not all combinations are valid. # Optional. Shielded VM Instance configuration settings.
+          &quot;shieldedInstanceConfig&quot;: { # A set of Shielded Instance options. Check [Images using supported Shielded VM features](https://cloud.google.com/compute/docs/instances/modifying-shielded-vm). Not all combinations are valid. # Optional. Shielded VM Instance configuration settings.
             &quot;enableIntegrityMonitoring&quot;: True or False, # Defines whether the instance has integrity monitoring enabled. Enables monitoring and attestation of the boot integrity of the instance. The attestation is performed against the integrity policy baseline. This baseline is initially derived from the implicitly trusted boot image when the instance is created. Enabled by default.
             &quot;enableSecureBoot&quot;: True or False, # Defines whether the instance has Secure Boot enabled. Secure Boot helps ensure that the system only runs authentic software by verifying the digital signature of all boot components, and halting the boot process if signature verification fails. Disabled by default.
             &quot;enableVtpm&quot;: True or False, # Defines whether the instance has the vTPM enabled. Enabled by default.
diff --git a/docs/dyn/people_v1.otherContacts.html b/docs/dyn/people_v1.otherContacts.html
index 9b427f0..c6c31f8 100644
--- a/docs/dyn/people_v1.otherContacts.html
+++ b/docs/dyn/people_v1.otherContacts.html
@@ -82,7 +82,7 @@
 <p class="firstline">Copies an "Other contact" to a new contact in the user's "myContacts" group</p>
 <p class="toc_element">
   <code><a href="#list">list(pageSize=None, pageToken=None, readMask=None, requestSyncToken=None, sources=None, syncToken=None, x__xgafv=None)</a></code></p>
-<p class="firstline">List all "Other contacts", that is contacts that are not in a contact group. "Other contacts" are typically auto created contacts from interactions. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the user's other contacts that have changed](/people/v1/other-contacts#list_the_users_other_contacts_that_have_changed).</p>
+<p class="firstline">List all "Other contacts", that is contacts that are not in a contact group. "Other contacts" are typically auto created contacts from interactions. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the user's other contacts that have changed](/people/v1/other-contacts#list_the_users_other_contacts_that_have_changed).</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>
@@ -130,7 +130,7 @@
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -143,6 +143,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -157,7 +158,7 @@
     { # A person&#x27;s age range.
       &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -170,6 +171,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -178,7 +180,7 @@
     { # A person&#x27;s short biography.
       &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -191,6 +193,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -204,7 +207,7 @@
         &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -217,6 +220,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -225,7 +229,7 @@
   &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
     { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -238,6 +242,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -247,7 +252,7 @@
     { # A person&#x27;s calendar URL.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -260,6 +265,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -270,7 +276,7 @@
     { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
       &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -283,6 +289,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -292,7 +299,7 @@
     { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
       &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -305,6 +312,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -315,7 +323,7 @@
       &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -328,6 +336,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -344,7 +353,7 @@
       },
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -357,6 +366,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -366,7 +376,7 @@
     { # An identifier from an external entity related to the person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -379,6 +389,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -388,7 +399,7 @@
   &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
     { # The name that should be used to sort the person in a list.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -401,6 +412,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -411,7 +423,7 @@
       &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -424,6 +436,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -434,7 +447,7 @@
       &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -447,6 +460,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -457,7 +471,7 @@
   &quot;interests&quot;: [ # The person&#x27;s interests.
     { # One of the person&#x27;s interests.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -470,6 +484,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -478,7 +493,7 @@
   &quot;locales&quot;: [ # The person&#x27;s locale preferences.
     { # A person&#x27;s locale preference.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -491,6 +506,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -504,7 +520,7 @@
       &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
       &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -517,6 +533,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -533,7 +550,7 @@
         &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -546,6 +563,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -578,7 +596,7 @@
     { # A person&#x27;s miscellaneous keyword.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -591,6 +609,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -606,7 +625,7 @@
       &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
       &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -619,6 +638,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -634,7 +654,7 @@
   &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
     { # A person&#x27;s nickname.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -647,6 +667,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -656,7 +677,7 @@
   &quot;occupations&quot;: [ # The person&#x27;s occupations.
     { # A person&#x27;s occupation.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -669,6 +690,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -688,7 +710,7 @@
       &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
       &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -701,6 +723,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -720,7 +743,7 @@
       &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -733,6 +756,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -743,7 +767,7 @@
     { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
       &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -756,6 +780,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -765,7 +790,7 @@
     { # A person&#x27;s relation to another person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -778,6 +803,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -788,7 +814,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -801,6 +827,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -810,7 +837,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -823,6 +850,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -832,7 +860,7 @@
     { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
       &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -845,6 +873,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -855,7 +884,7 @@
     { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -868,6 +897,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -877,7 +907,7 @@
   &quot;skills&quot;: [ # The person&#x27;s skills.
     { # A skill that the person has.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -890,6 +920,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -898,7 +929,7 @@
   &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
     { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -911,6 +942,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -920,7 +952,7 @@
     { # A person&#x27;s associated URLs.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -933,6 +965,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -943,7 +976,7 @@
     { # Arbitrary user data that is populated by the end users.
       &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -956,6 +989,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -966,7 +1000,7 @@
 
 <div class="method">
     <code class="details" id="list">list(pageSize=None, pageToken=None, readMask=None, requestSyncToken=None, sources=None, syncToken=None, x__xgafv=None)</code>
-  <pre>List all &quot;Other contacts&quot;, that is contacts that are not in a contact group. &quot;Other contacts&quot; are typically auto created contacts from interactions. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the user&#x27;s other contacts that have changed](/people/v1/other-contacts#list_the_users_other_contacts_that_have_changed).
+  <pre>List all &quot;Other contacts&quot;, that is contacts that are not in a contact group. &quot;Other contacts&quot; are typically auto created contacts from interactions. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the user&#x27;s other contacts that have changed](/people/v1/other-contacts#list_the_users_other_contacts_that_have_changed).
 
 Args:
   pageSize: integer, Optional. The number of &quot;Other contacts&quot; to include in the response. Valid values are between 1 and 1000, inclusive. Defaults to 100 if not set or set to 0.
@@ -1002,7 +1036,7 @@
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1015,6 +1049,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -1029,7 +1064,7 @@
         { # A person&#x27;s age range.
           &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1042,6 +1077,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -1050,7 +1086,7 @@
         { # A person&#x27;s short biography.
           &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1063,6 +1099,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -1076,7 +1113,7 @@
             &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1089,6 +1126,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -1097,7 +1135,7 @@
       &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
         { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1110,6 +1148,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -1119,7 +1158,7 @@
         { # A person&#x27;s calendar URL.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1132,6 +1171,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -1142,7 +1182,7 @@
         { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
           &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1155,6 +1195,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -1164,7 +1205,7 @@
         { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
           &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1177,6 +1218,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -1187,7 +1229,7 @@
           &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1200,6 +1242,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -1216,7 +1259,7 @@
           },
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1229,6 +1272,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -1238,7 +1282,7 @@
         { # An identifier from an external entity related to the person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1251,6 +1295,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -1260,7 +1305,7 @@
       &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
         { # The name that should be used to sort the person in a list.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1273,6 +1318,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -1283,7 +1329,7 @@
           &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1296,6 +1342,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -1306,7 +1353,7 @@
           &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1319,6 +1366,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -1329,7 +1377,7 @@
       &quot;interests&quot;: [ # The person&#x27;s interests.
         { # One of the person&#x27;s interests.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1342,6 +1390,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -1350,7 +1399,7 @@
       &quot;locales&quot;: [ # The person&#x27;s locale preferences.
         { # A person&#x27;s locale preference.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1363,6 +1412,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -1376,7 +1426,7 @@
           &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
           &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1389,6 +1439,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -1405,7 +1456,7 @@
             &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1418,6 +1469,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -1450,7 +1502,7 @@
         { # A person&#x27;s miscellaneous keyword.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1463,6 +1515,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -1478,7 +1531,7 @@
           &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
           &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1491,6 +1544,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -1506,7 +1560,7 @@
       &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
         { # A person&#x27;s nickname.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1519,6 +1573,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -1528,7 +1583,7 @@
       &quot;occupations&quot;: [ # The person&#x27;s occupations.
         { # A person&#x27;s occupation.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1541,6 +1596,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -1560,7 +1616,7 @@
           &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
           &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1573,6 +1629,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -1592,7 +1649,7 @@
           &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1605,6 +1662,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -1615,7 +1673,7 @@
         { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
           &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1628,6 +1686,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -1637,7 +1696,7 @@
         { # A person&#x27;s relation to another person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1650,6 +1709,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -1660,7 +1720,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1673,6 +1733,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -1682,7 +1743,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1695,6 +1756,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -1704,7 +1766,7 @@
         { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
           &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1717,6 +1779,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -1727,7 +1790,7 @@
         { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1740,6 +1803,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -1749,7 +1813,7 @@
       &quot;skills&quot;: [ # The person&#x27;s skills.
         { # A skill that the person has.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1762,6 +1826,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -1770,7 +1835,7 @@
       &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
         { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1783,6 +1848,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -1792,7 +1858,7 @@
         { # A person&#x27;s associated URLs.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1805,6 +1871,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -1815,7 +1882,7 @@
         { # Arbitrary user data that is populated by the end users.
           &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1828,6 +1895,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -1882,7 +1950,7 @@
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1895,6 +1963,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -1909,7 +1978,7 @@
           { # A person&#x27;s age range.
             &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1922,6 +1991,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -1930,7 +2000,7 @@
           { # A person&#x27;s short biography.
             &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1943,6 +2013,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -1956,7 +2027,7 @@
               &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1969,6 +2040,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -1977,7 +2049,7 @@
         &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
           { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1990,6 +2062,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -1999,7 +2072,7 @@
           { # A person&#x27;s calendar URL.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2012,6 +2085,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -2022,7 +2096,7 @@
           { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
             &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2035,6 +2109,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -2044,7 +2119,7 @@
           { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
             &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2057,6 +2132,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -2067,7 +2143,7 @@
             &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2080,6 +2156,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -2096,7 +2173,7 @@
             },
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2109,6 +2186,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -2118,7 +2196,7 @@
           { # An identifier from an external entity related to the person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2131,6 +2209,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -2140,7 +2219,7 @@
         &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
           { # The name that should be used to sort the person in a list.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2153,6 +2232,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -2163,7 +2243,7 @@
             &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2176,6 +2256,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -2186,7 +2267,7 @@
             &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2199,6 +2280,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -2209,7 +2291,7 @@
         &quot;interests&quot;: [ # The person&#x27;s interests.
           { # One of the person&#x27;s interests.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2222,6 +2304,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -2230,7 +2313,7 @@
         &quot;locales&quot;: [ # The person&#x27;s locale preferences.
           { # A person&#x27;s locale preference.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2243,6 +2326,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -2256,7 +2340,7 @@
             &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
             &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2269,6 +2353,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -2285,7 +2370,7 @@
               &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2298,6 +2383,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -2330,7 +2416,7 @@
           { # A person&#x27;s miscellaneous keyword.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2343,6 +2429,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -2358,7 +2445,7 @@
             &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
             &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2371,6 +2458,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -2386,7 +2474,7 @@
         &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
           { # A person&#x27;s nickname.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2399,6 +2487,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -2408,7 +2497,7 @@
         &quot;occupations&quot;: [ # The person&#x27;s occupations.
           { # A person&#x27;s occupation.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2421,6 +2510,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -2440,7 +2530,7 @@
             &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
             &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2453,6 +2543,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -2472,7 +2563,7 @@
             &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2485,6 +2576,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -2495,7 +2587,7 @@
           { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
             &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2508,6 +2600,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -2517,7 +2610,7 @@
           { # A person&#x27;s relation to another person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2530,6 +2623,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -2540,7 +2634,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2553,6 +2647,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -2562,7 +2657,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2575,6 +2670,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -2584,7 +2680,7 @@
           { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
             &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2597,6 +2693,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -2607,7 +2704,7 @@
           { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2620,6 +2717,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -2629,7 +2727,7 @@
         &quot;skills&quot;: [ # The person&#x27;s skills.
           { # A skill that the person has.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2642,6 +2740,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -2650,7 +2749,7 @@
         &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
           { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2663,6 +2762,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -2672,7 +2772,7 @@
           { # A person&#x27;s associated URLs.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2685,6 +2785,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -2695,7 +2796,7 @@
           { # Arbitrary user data that is populated by the end users.
             &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2708,6 +2809,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
diff --git a/docs/dyn/people_v1.people.connections.html b/docs/dyn/people_v1.people.connections.html
index 5bb979e..eacaed0 100644
--- a/docs/dyn/people_v1.people.connections.html
+++ b/docs/dyn/people_v1.people.connections.html
@@ -79,7 +79,7 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#list">list(resourceName, pageSize=None, pageToken=None, personFields=None, requestMask_includeField=None, requestSyncToken=None, sortOrder=None, sources=None, syncToken=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Provides a list of the authenticated user's contacts. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the user's contacts that have changed](/people/v1/contacts#list_the_users_contacts_that_have_changed).</p>
+<p class="firstline">Provides a list of the authenticated user's contacts. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the user's contacts that have changed](/people/v1/contacts#list_the_users_contacts_that_have_changed).</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>
@@ -91,7 +91,7 @@
 
 <div class="method">
     <code class="details" id="list">list(resourceName, pageSize=None, pageToken=None, personFields=None, requestMask_includeField=None, requestSyncToken=None, sortOrder=None, sources=None, syncToken=None, x__xgafv=None)</code>
-  <pre>Provides a list of the authenticated user&#x27;s contacts. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the user&#x27;s contacts that have changed](/people/v1/contacts#list_the_users_contacts_that_have_changed).
+  <pre>Provides a list of the authenticated user&#x27;s contacts. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the user&#x27;s contacts that have changed](/people/v1/contacts#list_the_users_contacts_that_have_changed).
 
 Args:
   resourceName: string, Required. The resource name to return connections for. Only `people/me` is valid. (required)
@@ -133,7 +133,7 @@
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -146,6 +146,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -160,7 +161,7 @@
         { # A person&#x27;s age range.
           &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -173,6 +174,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -181,7 +183,7 @@
         { # A person&#x27;s short biography.
           &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -194,6 +196,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -207,7 +210,7 @@
             &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -220,6 +223,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -228,7 +232,7 @@
       &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
         { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -241,6 +245,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -250,7 +255,7 @@
         { # A person&#x27;s calendar URL.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -263,6 +268,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -273,7 +279,7 @@
         { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
           &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -286,6 +292,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -295,7 +302,7 @@
         { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
           &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -308,6 +315,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -318,7 +326,7 @@
           &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -331,6 +339,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -347,7 +356,7 @@
           },
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -360,6 +369,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -369,7 +379,7 @@
         { # An identifier from an external entity related to the person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -382,6 +392,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -391,7 +402,7 @@
       &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
         { # The name that should be used to sort the person in a list.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -404,6 +415,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -414,7 +426,7 @@
           &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -427,6 +439,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -437,7 +450,7 @@
           &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -450,6 +463,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -460,7 +474,7 @@
       &quot;interests&quot;: [ # The person&#x27;s interests.
         { # One of the person&#x27;s interests.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -473,6 +487,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -481,7 +496,7 @@
       &quot;locales&quot;: [ # The person&#x27;s locale preferences.
         { # A person&#x27;s locale preference.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -494,6 +509,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -507,7 +523,7 @@
           &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
           &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -520,6 +536,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -536,7 +553,7 @@
             &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -549,6 +566,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -581,7 +599,7 @@
         { # A person&#x27;s miscellaneous keyword.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -594,6 +612,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -609,7 +628,7 @@
           &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
           &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -622,6 +641,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -637,7 +657,7 @@
       &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
         { # A person&#x27;s nickname.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -650,6 +670,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -659,7 +680,7 @@
       &quot;occupations&quot;: [ # The person&#x27;s occupations.
         { # A person&#x27;s occupation.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -672,6 +693,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -691,7 +713,7 @@
           &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
           &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -704,6 +726,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -723,7 +746,7 @@
           &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -736,6 +759,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -746,7 +770,7 @@
         { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
           &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -759,6 +783,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -768,7 +793,7 @@
         { # A person&#x27;s relation to another person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -781,6 +806,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -791,7 +817,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -804,6 +830,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -813,7 +840,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -826,6 +853,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -835,7 +863,7 @@
         { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
           &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -848,6 +876,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -858,7 +887,7 @@
         { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -871,6 +900,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -880,7 +910,7 @@
       &quot;skills&quot;: [ # The person&#x27;s skills.
         { # A skill that the person has.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -893,6 +923,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -901,7 +932,7 @@
       &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
         { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -914,6 +945,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -923,7 +955,7 @@
         { # A person&#x27;s associated URLs.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -936,6 +968,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -946,7 +979,7 @@
         { # Arbitrary user data that is populated by the end users.
           &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -959,6 +992,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
diff --git a/docs/dyn/people_v1.people.html b/docs/dyn/people_v1.people.html
index bde6b99..07ea4b0 100644
--- a/docs/dyn/people_v1.people.html
+++ b/docs/dyn/people_v1.people.html
@@ -108,7 +108,7 @@
 <p class="firstline">Provides information about a list of specific people by specifying a list of requested resource names. Use `people/me` to indicate the authenticated user. The request returns a 400 error if 'personFields' is not specified.</p>
 <p class="toc_element">
   <code><a href="#listDirectoryPeople">listDirectoryPeople(mergeSources=None, pageSize=None, pageToken=None, readMask=None, requestSyncToken=None, sources=None, syncToken=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Provides a list of domain profiles and domain contacts in the authenticated user's domain directory. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the directory people that have changed](/people/v1/directory#list_the_directory_people_that_have_changed).</p>
+<p class="firstline">Provides a list of domain profiles and domain contacts in the authenticated user's domain directory. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the directory people that have changed](/people/v1/directory#list_the_directory_people_that_have_changed).</p>
 <p class="toc_element">
   <code><a href="#listDirectoryPeople_next">listDirectoryPeople_next(previous_request, previous_response)</a></code></p>
 <p class="firstline">Retrieves the next page of results.</p>
@@ -149,7 +149,7 @@
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -162,6 +162,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -176,7 +177,7 @@
           { # A person&#x27;s age range.
             &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -189,6 +190,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -197,7 +199,7 @@
           { # A person&#x27;s short biography.
             &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -210,6 +212,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -223,7 +226,7 @@
               &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -236,6 +239,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -244,7 +248,7 @@
         &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
           { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -257,6 +261,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -266,7 +271,7 @@
           { # A person&#x27;s calendar URL.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -279,6 +284,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -289,7 +295,7 @@
           { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
             &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -302,6 +308,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -311,7 +318,7 @@
           { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
             &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -324,6 +331,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -334,7 +342,7 @@
             &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -347,6 +355,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -363,7 +372,7 @@
             },
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -376,6 +385,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -385,7 +395,7 @@
           { # An identifier from an external entity related to the person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -398,6 +408,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -407,7 +418,7 @@
         &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
           { # The name that should be used to sort the person in a list.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -420,6 +431,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -430,7 +442,7 @@
             &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -443,6 +455,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -453,7 +466,7 @@
             &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -466,6 +479,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -476,7 +490,7 @@
         &quot;interests&quot;: [ # The person&#x27;s interests.
           { # One of the person&#x27;s interests.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -489,6 +503,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -497,7 +512,7 @@
         &quot;locales&quot;: [ # The person&#x27;s locale preferences.
           { # A person&#x27;s locale preference.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -510,6 +525,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -523,7 +539,7 @@
             &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
             &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -536,6 +552,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -552,7 +569,7 @@
               &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -565,6 +582,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -597,7 +615,7 @@
           { # A person&#x27;s miscellaneous keyword.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -610,6 +628,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -625,7 +644,7 @@
             &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
             &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -638,6 +657,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -653,7 +673,7 @@
         &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
           { # A person&#x27;s nickname.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -666,6 +686,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -675,7 +696,7 @@
         &quot;occupations&quot;: [ # The person&#x27;s occupations.
           { # A person&#x27;s occupation.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -688,6 +709,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -707,7 +729,7 @@
             &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
             &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -720,6 +742,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -739,7 +762,7 @@
             &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -752,6 +775,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -762,7 +786,7 @@
           { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
             &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -775,6 +799,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -784,7 +809,7 @@
           { # A person&#x27;s relation to another person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -797,6 +822,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -807,7 +833,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -820,6 +846,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -829,7 +856,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -842,6 +869,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -851,7 +879,7 @@
           { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
             &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -864,6 +892,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -874,7 +903,7 @@
           { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -887,6 +916,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -896,7 +926,7 @@
         &quot;skills&quot;: [ # The person&#x27;s skills.
           { # A skill that the person has.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -909,6 +939,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -917,7 +948,7 @@
         &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
           { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -930,6 +961,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -939,7 +971,7 @@
           { # A person&#x27;s associated URLs.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -952,6 +984,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -962,7 +995,7 @@
           { # Arbitrary user data that is populated by the end users.
             &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -975,6 +1008,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -1011,7 +1045,7 @@
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1024,6 +1058,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -1038,7 +1073,7 @@
           { # A person&#x27;s age range.
             &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1051,6 +1086,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -1059,7 +1095,7 @@
           { # A person&#x27;s short biography.
             &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1072,6 +1108,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -1085,7 +1122,7 @@
               &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1098,6 +1135,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -1106,7 +1144,7 @@
         &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
           { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1119,6 +1157,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -1128,7 +1167,7 @@
           { # A person&#x27;s calendar URL.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1141,6 +1180,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -1151,7 +1191,7 @@
           { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
             &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1164,6 +1204,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -1173,7 +1214,7 @@
           { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
             &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1186,6 +1227,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -1196,7 +1238,7 @@
             &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1209,6 +1251,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -1225,7 +1268,7 @@
             },
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1238,6 +1281,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -1247,7 +1291,7 @@
           { # An identifier from an external entity related to the person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1260,6 +1304,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -1269,7 +1314,7 @@
         &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
           { # The name that should be used to sort the person in a list.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1282,6 +1327,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -1292,7 +1338,7 @@
             &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1305,6 +1351,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -1315,7 +1362,7 @@
             &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1328,6 +1375,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -1338,7 +1386,7 @@
         &quot;interests&quot;: [ # The person&#x27;s interests.
           { # One of the person&#x27;s interests.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1351,6 +1399,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -1359,7 +1408,7 @@
         &quot;locales&quot;: [ # The person&#x27;s locale preferences.
           { # A person&#x27;s locale preference.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1372,6 +1421,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -1385,7 +1435,7 @@
             &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
             &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1398,6 +1448,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -1414,7 +1465,7 @@
               &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1427,6 +1478,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -1459,7 +1511,7 @@
           { # A person&#x27;s miscellaneous keyword.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1472,6 +1524,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -1487,7 +1540,7 @@
             &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
             &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1500,6 +1553,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -1515,7 +1569,7 @@
         &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
           { # A person&#x27;s nickname.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1528,6 +1582,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -1537,7 +1592,7 @@
         &quot;occupations&quot;: [ # The person&#x27;s occupations.
           { # A person&#x27;s occupation.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1550,6 +1605,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -1569,7 +1625,7 @@
             &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
             &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1582,6 +1638,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -1601,7 +1658,7 @@
             &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1614,6 +1671,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -1624,7 +1682,7 @@
           { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
             &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1637,6 +1695,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -1646,7 +1705,7 @@
           { # A person&#x27;s relation to another person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1659,6 +1718,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -1669,7 +1729,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1682,6 +1742,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -1691,7 +1752,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1704,6 +1765,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -1713,7 +1775,7 @@
           { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
             &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1726,6 +1788,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -1736,7 +1799,7 @@
           { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1749,6 +1812,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -1758,7 +1822,7 @@
         &quot;skills&quot;: [ # The person&#x27;s skills.
           { # A skill that the person has.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1771,6 +1835,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -1779,7 +1844,7 @@
         &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
           { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1792,6 +1857,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -1801,7 +1867,7 @@
           { # A person&#x27;s associated URLs.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1814,6 +1880,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -1824,7 +1891,7 @@
           { # Arbitrary user data that is populated by the end users.
             &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1837,6 +1904,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -1904,7 +1972,7 @@
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1917,6 +1985,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -1931,7 +2000,7 @@
         { # A person&#x27;s age range.
           &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1944,6 +2013,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -1952,7 +2022,7 @@
         { # A person&#x27;s short biography.
           &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1965,6 +2035,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -1978,7 +2049,7 @@
             &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -1991,6 +2062,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -1999,7 +2071,7 @@
       &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
         { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2012,6 +2084,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -2021,7 +2094,7 @@
         { # A person&#x27;s calendar URL.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2034,6 +2107,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -2044,7 +2118,7 @@
         { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
           &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2057,6 +2131,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -2066,7 +2141,7 @@
         { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
           &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2079,6 +2154,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -2089,7 +2165,7 @@
           &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2102,6 +2178,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -2118,7 +2195,7 @@
           },
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2131,6 +2208,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -2140,7 +2218,7 @@
         { # An identifier from an external entity related to the person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2153,6 +2231,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -2162,7 +2241,7 @@
       &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
         { # The name that should be used to sort the person in a list.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2175,6 +2254,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -2185,7 +2265,7 @@
           &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2198,6 +2278,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -2208,7 +2289,7 @@
           &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2221,6 +2302,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -2231,7 +2313,7 @@
       &quot;interests&quot;: [ # The person&#x27;s interests.
         { # One of the person&#x27;s interests.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2244,6 +2326,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -2252,7 +2335,7 @@
       &quot;locales&quot;: [ # The person&#x27;s locale preferences.
         { # A person&#x27;s locale preference.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2265,6 +2348,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -2278,7 +2362,7 @@
           &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
           &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2291,6 +2375,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -2307,7 +2392,7 @@
             &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2320,6 +2405,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -2352,7 +2438,7 @@
         { # A person&#x27;s miscellaneous keyword.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2365,6 +2451,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -2380,7 +2467,7 @@
           &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
           &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2393,6 +2480,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -2408,7 +2496,7 @@
       &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
         { # A person&#x27;s nickname.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2421,6 +2509,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -2430,7 +2519,7 @@
       &quot;occupations&quot;: [ # The person&#x27;s occupations.
         { # A person&#x27;s occupation.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2443,6 +2532,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -2462,7 +2552,7 @@
           &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
           &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2475,6 +2565,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -2494,7 +2585,7 @@
           &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2507,6 +2598,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -2517,7 +2609,7 @@
         { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
           &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2530,6 +2622,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -2539,7 +2632,7 @@
         { # A person&#x27;s relation to another person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2552,6 +2645,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -2562,7 +2656,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2575,6 +2669,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -2584,7 +2679,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2597,6 +2692,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -2606,7 +2702,7 @@
         { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
           &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2619,6 +2715,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -2629,7 +2726,7 @@
         { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2642,6 +2739,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -2651,7 +2749,7 @@
       &quot;skills&quot;: [ # The person&#x27;s skills.
         { # A skill that the person has.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2664,6 +2762,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -2672,7 +2771,7 @@
       &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
         { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2685,6 +2784,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -2694,7 +2794,7 @@
         { # A person&#x27;s associated URLs.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2707,6 +2807,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -2717,7 +2818,7 @@
         { # Arbitrary user data that is populated by the end users.
           &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2730,6 +2831,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -2766,7 +2868,7 @@
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2779,6 +2881,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -2793,7 +2896,7 @@
           { # A person&#x27;s age range.
             &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2806,6 +2909,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -2814,7 +2918,7 @@
           { # A person&#x27;s short biography.
             &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2827,6 +2931,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -2840,7 +2945,7 @@
               &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2853,6 +2958,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -2861,7 +2967,7 @@
         &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
           { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2874,6 +2980,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -2883,7 +2990,7 @@
           { # A person&#x27;s calendar URL.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2896,6 +3003,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -2906,7 +3014,7 @@
           { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
             &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2919,6 +3027,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -2928,7 +3037,7 @@
           { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
             &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2941,6 +3050,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -2951,7 +3061,7 @@
             &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2964,6 +3074,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -2980,7 +3091,7 @@
             },
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -2993,6 +3104,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -3002,7 +3114,7 @@
           { # An identifier from an external entity related to the person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3015,6 +3127,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -3024,7 +3137,7 @@
         &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
           { # The name that should be used to sort the person in a list.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3037,6 +3150,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -3047,7 +3161,7 @@
             &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3060,6 +3174,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -3070,7 +3185,7 @@
             &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3083,6 +3198,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -3093,7 +3209,7 @@
         &quot;interests&quot;: [ # The person&#x27;s interests.
           { # One of the person&#x27;s interests.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3106,6 +3222,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -3114,7 +3231,7 @@
         &quot;locales&quot;: [ # The person&#x27;s locale preferences.
           { # A person&#x27;s locale preference.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3127,6 +3244,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -3140,7 +3258,7 @@
             &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
             &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3153,6 +3271,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -3169,7 +3288,7 @@
               &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3182,6 +3301,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -3214,7 +3334,7 @@
           { # A person&#x27;s miscellaneous keyword.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3227,6 +3347,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -3242,7 +3363,7 @@
             &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
             &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3255,6 +3376,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -3270,7 +3392,7 @@
         &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
           { # A person&#x27;s nickname.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3283,6 +3405,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -3292,7 +3415,7 @@
         &quot;occupations&quot;: [ # The person&#x27;s occupations.
           { # A person&#x27;s occupation.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3305,6 +3428,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -3324,7 +3448,7 @@
             &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
             &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3337,6 +3461,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -3356,7 +3481,7 @@
             &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3369,6 +3494,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -3379,7 +3505,7 @@
           { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
             &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3392,6 +3518,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -3401,7 +3528,7 @@
           { # A person&#x27;s relation to another person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3414,6 +3541,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -3424,7 +3552,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3437,6 +3565,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -3446,7 +3575,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3459,6 +3588,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -3468,7 +3598,7 @@
           { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
             &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3481,6 +3611,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -3491,7 +3622,7 @@
           { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3504,6 +3635,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -3513,7 +3645,7 @@
         &quot;skills&quot;: [ # The person&#x27;s skills.
           { # A skill that the person has.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3526,6 +3658,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -3534,7 +3667,7 @@
         &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
           { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3547,6 +3680,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -3556,7 +3690,7 @@
           { # A person&#x27;s associated URLs.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3569,6 +3703,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -3579,7 +3714,7 @@
           { # Arbitrary user data that is populated by the end users.
             &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3592,6 +3727,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -3636,7 +3772,7 @@
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3649,6 +3785,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -3663,7 +3800,7 @@
     { # A person&#x27;s age range.
       &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3676,6 +3813,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -3684,7 +3822,7 @@
     { # A person&#x27;s short biography.
       &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3697,6 +3835,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -3710,7 +3849,7 @@
         &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3723,6 +3862,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -3731,7 +3871,7 @@
   &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
     { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3744,6 +3884,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -3753,7 +3894,7 @@
     { # A person&#x27;s calendar URL.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3766,6 +3907,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -3776,7 +3918,7 @@
     { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
       &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3789,6 +3931,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -3798,7 +3941,7 @@
     { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
       &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3811,6 +3954,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -3821,7 +3965,7 @@
       &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3834,6 +3978,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -3850,7 +3995,7 @@
       },
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3863,6 +4008,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -3872,7 +4018,7 @@
     { # An identifier from an external entity related to the person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3885,6 +4031,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -3894,7 +4041,7 @@
   &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
     { # The name that should be used to sort the person in a list.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3907,6 +4054,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -3917,7 +4065,7 @@
       &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3930,6 +4078,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -3940,7 +4089,7 @@
       &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3953,6 +4102,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -3963,7 +4113,7 @@
   &quot;interests&quot;: [ # The person&#x27;s interests.
     { # One of the person&#x27;s interests.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3976,6 +4126,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -3984,7 +4135,7 @@
   &quot;locales&quot;: [ # The person&#x27;s locale preferences.
     { # A person&#x27;s locale preference.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -3997,6 +4148,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -4010,7 +4162,7 @@
       &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
       &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4023,6 +4175,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -4039,7 +4192,7 @@
         &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4052,6 +4205,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -4084,7 +4238,7 @@
     { # A person&#x27;s miscellaneous keyword.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4097,6 +4251,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -4112,7 +4267,7 @@
       &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
       &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4125,6 +4280,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -4140,7 +4296,7 @@
   &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
     { # A person&#x27;s nickname.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4153,6 +4309,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -4162,7 +4319,7 @@
   &quot;occupations&quot;: [ # The person&#x27;s occupations.
     { # A person&#x27;s occupation.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4175,6 +4332,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -4194,7 +4352,7 @@
       &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
       &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4207,6 +4365,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -4226,7 +4385,7 @@
       &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4239,6 +4398,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -4249,7 +4409,7 @@
     { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
       &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4262,6 +4422,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -4271,7 +4432,7 @@
     { # A person&#x27;s relation to another person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4284,6 +4445,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -4294,7 +4456,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4307,6 +4469,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -4316,7 +4479,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4329,6 +4492,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -4338,7 +4502,7 @@
     { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
       &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4351,6 +4515,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -4361,7 +4526,7 @@
     { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4374,6 +4539,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -4383,7 +4549,7 @@
   &quot;skills&quot;: [ # The person&#x27;s skills.
     { # A skill that the person has.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4396,6 +4562,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -4404,7 +4571,7 @@
   &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
     { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4417,6 +4584,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -4426,7 +4594,7 @@
     { # A person&#x27;s associated URLs.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4439,6 +4607,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -4449,7 +4618,7 @@
     { # Arbitrary user data that is populated by the end users.
       &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4462,6 +4631,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -4494,7 +4664,7 @@
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4507,6 +4677,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -4521,7 +4692,7 @@
     { # A person&#x27;s age range.
       &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4534,6 +4705,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -4542,7 +4714,7 @@
     { # A person&#x27;s short biography.
       &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4555,6 +4727,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -4568,7 +4741,7 @@
         &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4581,6 +4754,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -4589,7 +4763,7 @@
   &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
     { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4602,6 +4776,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -4611,7 +4786,7 @@
     { # A person&#x27;s calendar URL.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4624,6 +4799,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -4634,7 +4810,7 @@
     { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
       &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4647,6 +4823,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -4656,7 +4833,7 @@
     { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
       &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4669,6 +4846,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -4679,7 +4857,7 @@
       &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4692,6 +4870,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -4708,7 +4887,7 @@
       },
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4721,6 +4900,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -4730,7 +4910,7 @@
     { # An identifier from an external entity related to the person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4743,6 +4923,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -4752,7 +4933,7 @@
   &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
     { # The name that should be used to sort the person in a list.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4765,6 +4946,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -4775,7 +4957,7 @@
       &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4788,6 +4970,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -4798,7 +4981,7 @@
       &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4811,6 +4994,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -4821,7 +5005,7 @@
   &quot;interests&quot;: [ # The person&#x27;s interests.
     { # One of the person&#x27;s interests.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4834,6 +5018,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -4842,7 +5027,7 @@
   &quot;locales&quot;: [ # The person&#x27;s locale preferences.
     { # A person&#x27;s locale preference.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4855,6 +5040,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -4868,7 +5054,7 @@
       &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
       &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4881,6 +5067,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -4897,7 +5084,7 @@
         &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4910,6 +5097,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -4942,7 +5130,7 @@
     { # A person&#x27;s miscellaneous keyword.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4955,6 +5143,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -4970,7 +5159,7 @@
       &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
       &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -4983,6 +5172,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -4998,7 +5188,7 @@
   &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
     { # A person&#x27;s nickname.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5011,6 +5201,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -5020,7 +5211,7 @@
   &quot;occupations&quot;: [ # The person&#x27;s occupations.
     { # A person&#x27;s occupation.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5033,6 +5224,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -5052,7 +5244,7 @@
       &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
       &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5065,6 +5257,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -5084,7 +5277,7 @@
       &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5097,6 +5290,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -5107,7 +5301,7 @@
     { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
       &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5120,6 +5314,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -5129,7 +5324,7 @@
     { # A person&#x27;s relation to another person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5142,6 +5337,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -5152,7 +5348,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5165,6 +5361,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -5174,7 +5371,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5187,6 +5384,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -5196,7 +5394,7 @@
     { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
       &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5209,6 +5407,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -5219,7 +5418,7 @@
     { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5232,6 +5431,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -5241,7 +5441,7 @@
   &quot;skills&quot;: [ # The person&#x27;s skills.
     { # A skill that the person has.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5254,6 +5454,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -5262,7 +5463,7 @@
   &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
     { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5275,6 +5476,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -5284,7 +5486,7 @@
     { # A person&#x27;s associated URLs.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5297,6 +5499,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -5307,7 +5510,7 @@
     { # Arbitrary user data that is populated by the end users.
       &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5320,6 +5523,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -5378,7 +5582,7 @@
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5391,6 +5595,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -5405,7 +5610,7 @@
       { # A person&#x27;s age range.
         &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5418,6 +5623,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
       },
@@ -5426,7 +5632,7 @@
       { # A person&#x27;s short biography.
         &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5439,6 +5645,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -5452,7 +5659,7 @@
           &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
         },
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5465,6 +5672,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -5473,7 +5681,7 @@
     &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
       { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5486,6 +5694,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -5495,7 +5704,7 @@
       { # A person&#x27;s calendar URL.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5508,6 +5717,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -5518,7 +5728,7 @@
       { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
         &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5531,6 +5741,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -5540,7 +5751,7 @@
       { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
         &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5553,6 +5764,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -5563,7 +5775,7 @@
         &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5576,6 +5788,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -5592,7 +5805,7 @@
         },
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5605,6 +5818,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -5614,7 +5828,7 @@
       { # An identifier from an external entity related to the person.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5627,6 +5841,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -5636,7 +5851,7 @@
     &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
       { # The name that should be used to sort the person in a list.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5649,6 +5864,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -5659,7 +5875,7 @@
         &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
         &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5672,6 +5888,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -5682,7 +5899,7 @@
         &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5695,6 +5912,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -5705,7 +5923,7 @@
     &quot;interests&quot;: [ # The person&#x27;s interests.
       { # One of the person&#x27;s interests.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5718,6 +5936,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -5726,7 +5945,7 @@
     &quot;locales&quot;: [ # The person&#x27;s locale preferences.
       { # A person&#x27;s locale preference.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5739,6 +5958,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -5752,7 +5972,7 @@
         &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
         &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5765,6 +5985,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -5781,7 +6002,7 @@
           &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
         },
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5794,6 +6015,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
       },
@@ -5826,7 +6048,7 @@
       { # A person&#x27;s miscellaneous keyword.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5839,6 +6061,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -5854,7 +6077,7 @@
         &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
         &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5867,6 +6090,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -5882,7 +6106,7 @@
     &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
       { # A person&#x27;s nickname.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5895,6 +6119,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -5904,7 +6129,7 @@
     &quot;occupations&quot;: [ # The person&#x27;s occupations.
       { # A person&#x27;s occupation.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5917,6 +6142,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -5936,7 +6162,7 @@
         &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
         &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5949,6 +6175,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -5968,7 +6195,7 @@
         &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -5981,6 +6208,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -5991,7 +6219,7 @@
       { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
         &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6004,6 +6232,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -6013,7 +6242,7 @@
       { # A person&#x27;s relation to another person.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6026,6 +6255,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -6036,7 +6266,7 @@
       { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
         &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6049,6 +6279,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -6058,7 +6289,7 @@
       { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
         &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6071,6 +6302,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -6080,7 +6312,7 @@
       { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
         &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6093,6 +6325,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -6103,7 +6336,7 @@
       { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6116,6 +6349,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -6125,7 +6359,7 @@
     &quot;skills&quot;: [ # The person&#x27;s skills.
       { # A skill that the person has.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6138,6 +6372,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -6146,7 +6381,7 @@
     &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
       { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6159,6 +6394,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -6168,7 +6404,7 @@
       { # A person&#x27;s associated URLs.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6181,6 +6417,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -6191,7 +6428,7 @@
       { # Arbitrary user data that is populated by the end users.
         &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6204,6 +6441,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -6245,7 +6483,7 @@
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6258,6 +6496,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -6272,7 +6511,7 @@
     { # A person&#x27;s age range.
       &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6285,6 +6524,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -6293,7 +6533,7 @@
     { # A person&#x27;s short biography.
       &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6306,6 +6546,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -6319,7 +6560,7 @@
         &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6332,6 +6573,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -6340,7 +6582,7 @@
   &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
     { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6353,6 +6595,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -6362,7 +6605,7 @@
     { # A person&#x27;s calendar URL.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6375,6 +6618,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -6385,7 +6629,7 @@
     { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
       &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6398,6 +6642,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -6407,7 +6652,7 @@
     { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
       &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6420,6 +6665,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -6430,7 +6676,7 @@
       &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6443,6 +6689,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -6459,7 +6706,7 @@
       },
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6472,6 +6719,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -6481,7 +6729,7 @@
     { # An identifier from an external entity related to the person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6494,6 +6742,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -6503,7 +6752,7 @@
   &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
     { # The name that should be used to sort the person in a list.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6516,6 +6765,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -6526,7 +6776,7 @@
       &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6539,6 +6789,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -6549,7 +6800,7 @@
       &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6562,6 +6813,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -6572,7 +6824,7 @@
   &quot;interests&quot;: [ # The person&#x27;s interests.
     { # One of the person&#x27;s interests.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6585,6 +6837,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -6593,7 +6846,7 @@
   &quot;locales&quot;: [ # The person&#x27;s locale preferences.
     { # A person&#x27;s locale preference.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6606,6 +6859,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -6619,7 +6873,7 @@
       &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
       &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6632,6 +6886,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -6648,7 +6903,7 @@
         &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6661,6 +6916,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -6693,7 +6949,7 @@
     { # A person&#x27;s miscellaneous keyword.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6706,6 +6962,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -6721,7 +6978,7 @@
       &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
       &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6734,6 +6991,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -6749,7 +7007,7 @@
   &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
     { # A person&#x27;s nickname.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6762,6 +7020,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -6771,7 +7030,7 @@
   &quot;occupations&quot;: [ # The person&#x27;s occupations.
     { # A person&#x27;s occupation.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6784,6 +7043,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -6803,7 +7063,7 @@
       &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
       &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6816,6 +7076,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -6835,7 +7096,7 @@
       &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6848,6 +7109,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -6858,7 +7120,7 @@
     { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
       &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6871,6 +7133,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -6880,7 +7143,7 @@
     { # A person&#x27;s relation to another person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6893,6 +7156,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -6903,7 +7167,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6916,6 +7180,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -6925,7 +7190,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6938,6 +7203,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -6947,7 +7213,7 @@
     { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
       &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6960,6 +7226,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -6970,7 +7237,7 @@
     { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -6983,6 +7250,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -6992,7 +7260,7 @@
   &quot;skills&quot;: [ # The person&#x27;s skills.
     { # A skill that the person has.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7005,6 +7273,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -7013,7 +7282,7 @@
   &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
     { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7026,6 +7295,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -7035,7 +7305,7 @@
     { # A person&#x27;s associated URLs.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7048,6 +7318,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -7058,7 +7329,7 @@
     { # Arbitrary user data that is populated by the end users.
       &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7071,6 +7342,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -7115,7 +7387,7 @@
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7128,6 +7400,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -7142,7 +7415,7 @@
           { # A person&#x27;s age range.
             &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7155,6 +7428,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -7163,7 +7437,7 @@
           { # A person&#x27;s short biography.
             &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7176,6 +7450,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -7189,7 +7464,7 @@
               &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7202,6 +7477,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -7210,7 +7486,7 @@
         &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
           { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7223,6 +7499,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -7232,7 +7509,7 @@
           { # A person&#x27;s calendar URL.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7245,6 +7522,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -7255,7 +7533,7 @@
           { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
             &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7268,6 +7546,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -7277,7 +7556,7 @@
           { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
             &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7290,6 +7569,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -7300,7 +7580,7 @@
             &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7313,6 +7593,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -7329,7 +7610,7 @@
             },
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7342,6 +7623,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -7351,7 +7633,7 @@
           { # An identifier from an external entity related to the person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7364,6 +7646,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -7373,7 +7656,7 @@
         &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
           { # The name that should be used to sort the person in a list.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7386,6 +7669,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -7396,7 +7680,7 @@
             &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7409,6 +7693,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -7419,7 +7704,7 @@
             &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7432,6 +7717,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -7442,7 +7728,7 @@
         &quot;interests&quot;: [ # The person&#x27;s interests.
           { # One of the person&#x27;s interests.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7455,6 +7741,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -7463,7 +7750,7 @@
         &quot;locales&quot;: [ # The person&#x27;s locale preferences.
           { # A person&#x27;s locale preference.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7476,6 +7763,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -7489,7 +7777,7 @@
             &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
             &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7502,6 +7790,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -7518,7 +7807,7 @@
               &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7531,6 +7820,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -7563,7 +7853,7 @@
           { # A person&#x27;s miscellaneous keyword.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7576,6 +7866,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -7591,7 +7882,7 @@
             &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
             &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7604,6 +7895,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -7619,7 +7911,7 @@
         &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
           { # A person&#x27;s nickname.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7632,6 +7924,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -7641,7 +7934,7 @@
         &quot;occupations&quot;: [ # The person&#x27;s occupations.
           { # A person&#x27;s occupation.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7654,6 +7947,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -7673,7 +7967,7 @@
             &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
             &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7686,6 +7980,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -7705,7 +8000,7 @@
             &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7718,6 +8013,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -7728,7 +8024,7 @@
           { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
             &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7741,6 +8037,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -7750,7 +8047,7 @@
           { # A person&#x27;s relation to another person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7763,6 +8060,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -7773,7 +8071,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7786,6 +8084,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -7795,7 +8094,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7808,6 +8107,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -7817,7 +8117,7 @@
           { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
             &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7830,6 +8130,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -7840,7 +8141,7 @@
           { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7853,6 +8154,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -7862,7 +8164,7 @@
         &quot;skills&quot;: [ # The person&#x27;s skills.
           { # A skill that the person has.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7875,6 +8177,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -7883,7 +8186,7 @@
         &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
           { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7896,6 +8199,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -7905,7 +8209,7 @@
           { # A person&#x27;s associated URLs.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7918,6 +8222,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -7928,7 +8233,7 @@
           { # Arbitrary user data that is populated by the end users.
             &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -7941,6 +8246,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -7964,7 +8270,7 @@
 
 <div class="method">
     <code class="details" id="listDirectoryPeople">listDirectoryPeople(mergeSources=None, pageSize=None, pageToken=None, readMask=None, requestSyncToken=None, sources=None, syncToken=None, x__xgafv=None)</code>
-  <pre>Provides a list of domain profiles and domain contacts in the authenticated user&#x27;s domain directory. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the directory people that have changed](/people/v1/directory#list_the_directory_people_that_have_changed).
+  <pre>Provides a list of domain profiles and domain contacts in the authenticated user&#x27;s domain directory. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the directory people that have changed](/people/v1/directory#list_the_directory_people_that_have_changed).
 
 Args:
   mergeSources: string, Optional. Additional data to merge into the directory sources if they are connected through verified join keys such as email addresses or phone numbers. (repeated)
@@ -8003,7 +8309,7 @@
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8016,6 +8322,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -8030,7 +8337,7 @@
         { # A person&#x27;s age range.
           &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8043,6 +8350,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -8051,7 +8359,7 @@
         { # A person&#x27;s short biography.
           &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8064,6 +8372,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -8077,7 +8386,7 @@
             &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8090,6 +8399,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -8098,7 +8408,7 @@
       &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
         { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8111,6 +8421,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -8120,7 +8431,7 @@
         { # A person&#x27;s calendar URL.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8133,6 +8444,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -8143,7 +8455,7 @@
         { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
           &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8156,6 +8468,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -8165,7 +8478,7 @@
         { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
           &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8178,6 +8491,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -8188,7 +8502,7 @@
           &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8201,6 +8515,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -8217,7 +8532,7 @@
           },
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8230,6 +8545,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -8239,7 +8555,7 @@
         { # An identifier from an external entity related to the person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8252,6 +8568,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -8261,7 +8578,7 @@
       &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
         { # The name that should be used to sort the person in a list.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8274,6 +8591,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -8284,7 +8602,7 @@
           &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8297,6 +8615,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -8307,7 +8626,7 @@
           &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8320,6 +8639,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -8330,7 +8650,7 @@
       &quot;interests&quot;: [ # The person&#x27;s interests.
         { # One of the person&#x27;s interests.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8343,6 +8663,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -8351,7 +8672,7 @@
       &quot;locales&quot;: [ # The person&#x27;s locale preferences.
         { # A person&#x27;s locale preference.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8364,6 +8685,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -8377,7 +8699,7 @@
           &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
           &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8390,6 +8712,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -8406,7 +8729,7 @@
             &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8419,6 +8742,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -8451,7 +8775,7 @@
         { # A person&#x27;s miscellaneous keyword.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8464,6 +8788,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -8479,7 +8804,7 @@
           &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
           &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8492,6 +8817,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -8507,7 +8833,7 @@
       &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
         { # A person&#x27;s nickname.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8520,6 +8846,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -8529,7 +8856,7 @@
       &quot;occupations&quot;: [ # The person&#x27;s occupations.
         { # A person&#x27;s occupation.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8542,6 +8869,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -8561,7 +8889,7 @@
           &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
           &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8574,6 +8902,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -8593,7 +8922,7 @@
           &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8606,6 +8935,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -8616,7 +8946,7 @@
         { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
           &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8629,6 +8959,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -8638,7 +8969,7 @@
         { # A person&#x27;s relation to another person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8651,6 +8982,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -8661,7 +8993,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8674,6 +9006,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -8683,7 +9016,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8696,6 +9029,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -8705,7 +9039,7 @@
         { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
           &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8718,6 +9052,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -8728,7 +9063,7 @@
         { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8741,6 +9076,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -8750,7 +9086,7 @@
       &quot;skills&quot;: [ # The person&#x27;s skills.
         { # A skill that the person has.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8763,6 +9099,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -8771,7 +9108,7 @@
       &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
         { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8784,6 +9121,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -8793,7 +9131,7 @@
         { # A person&#x27;s associated URLs.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8806,6 +9144,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -8816,7 +9155,7 @@
         { # Arbitrary user data that is populated by the end users.
           &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8829,6 +9168,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -8888,7 +9228,7 @@
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8901,6 +9241,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -8915,7 +9256,7 @@
           { # A person&#x27;s age range.
             &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8928,6 +9269,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -8936,7 +9278,7 @@
           { # A person&#x27;s short biography.
             &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8949,6 +9291,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -8962,7 +9305,7 @@
               &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8975,6 +9318,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -8983,7 +9327,7 @@
         &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
           { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -8996,6 +9340,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -9005,7 +9350,7 @@
           { # A person&#x27;s calendar URL.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9018,6 +9363,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -9028,7 +9374,7 @@
           { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
             &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9041,6 +9387,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -9050,7 +9397,7 @@
           { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
             &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9063,6 +9410,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -9073,7 +9421,7 @@
             &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9086,6 +9434,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -9102,7 +9451,7 @@
             },
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9115,6 +9464,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -9124,7 +9474,7 @@
           { # An identifier from an external entity related to the person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9137,6 +9487,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -9146,7 +9497,7 @@
         &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
           { # The name that should be used to sort the person in a list.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9159,6 +9510,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -9169,7 +9521,7 @@
             &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9182,6 +9534,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -9192,7 +9545,7 @@
             &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9205,6 +9558,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -9215,7 +9569,7 @@
         &quot;interests&quot;: [ # The person&#x27;s interests.
           { # One of the person&#x27;s interests.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9228,6 +9582,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -9236,7 +9591,7 @@
         &quot;locales&quot;: [ # The person&#x27;s locale preferences.
           { # A person&#x27;s locale preference.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9249,6 +9604,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -9262,7 +9618,7 @@
             &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
             &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9275,6 +9631,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -9291,7 +9648,7 @@
               &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
             },
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9304,6 +9661,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
           },
@@ -9336,7 +9694,7 @@
           { # A person&#x27;s miscellaneous keyword.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9349,6 +9707,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -9364,7 +9723,7 @@
             &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
             &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9377,6 +9736,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -9392,7 +9752,7 @@
         &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
           { # A person&#x27;s nickname.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9405,6 +9765,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -9414,7 +9775,7 @@
         &quot;occupations&quot;: [ # The person&#x27;s occupations.
           { # A person&#x27;s occupation.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9427,6 +9788,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -9446,7 +9808,7 @@
             &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
             &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9459,6 +9821,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -9478,7 +9841,7 @@
             &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9491,6 +9854,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -9501,7 +9865,7 @@
           { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
             &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9514,6 +9878,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -9523,7 +9888,7 @@
           { # A person&#x27;s relation to another person.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9536,6 +9901,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -9546,7 +9912,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9559,6 +9925,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -9568,7 +9935,7 @@
           { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
             &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9581,6 +9948,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -9590,7 +9958,7 @@
           { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
             &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9603,6 +9971,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -9613,7 +9982,7 @@
           { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9626,6 +9995,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -9635,7 +10005,7 @@
         &quot;skills&quot;: [ # The person&#x27;s skills.
           { # A skill that the person has.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9648,6 +10018,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -9656,7 +10027,7 @@
         &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
           { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9669,6 +10040,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -9678,7 +10050,7 @@
           { # A person&#x27;s associated URLs.
             &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9691,6 +10063,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -9701,7 +10074,7 @@
           { # Arbitrary user data that is populated by the end users.
             &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
             &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-              &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+              &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
               &quot;source&quot;: { # The source of a field. # The source of the field.
                 &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
                 &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9714,6 +10087,7 @@
                 &quot;type&quot;: &quot;A String&quot;, # The source type.
                 &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
               },
+              &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
               &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
             },
             &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -9764,7 +10138,7 @@
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9777,6 +10151,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -9791,7 +10166,7 @@
         { # A person&#x27;s age range.
           &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9804,6 +10179,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -9812,7 +10188,7 @@
         { # A person&#x27;s short biography.
           &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9825,6 +10201,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -9838,7 +10215,7 @@
             &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9851,6 +10228,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -9859,7 +10237,7 @@
       &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
         { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9872,6 +10250,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -9881,7 +10260,7 @@
         { # A person&#x27;s calendar URL.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9894,6 +10273,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -9904,7 +10284,7 @@
         { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
           &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9917,6 +10297,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -9926,7 +10307,7 @@
         { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
           &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9939,6 +10320,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -9949,7 +10331,7 @@
           &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9962,6 +10344,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -9978,7 +10361,7 @@
           },
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -9991,6 +10374,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -10000,7 +10384,7 @@
         { # An identifier from an external entity related to the person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10013,6 +10397,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -10022,7 +10407,7 @@
       &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
         { # The name that should be used to sort the person in a list.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10035,6 +10420,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -10045,7 +10431,7 @@
           &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10058,6 +10444,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -10068,7 +10455,7 @@
           &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10081,6 +10468,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -10091,7 +10479,7 @@
       &quot;interests&quot;: [ # The person&#x27;s interests.
         { # One of the person&#x27;s interests.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10104,6 +10492,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -10112,7 +10501,7 @@
       &quot;locales&quot;: [ # The person&#x27;s locale preferences.
         { # A person&#x27;s locale preference.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10125,6 +10514,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -10138,7 +10528,7 @@
           &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
           &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10151,6 +10541,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -10167,7 +10558,7 @@
             &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
           },
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10180,6 +10571,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
         },
@@ -10212,7 +10604,7 @@
         { # A person&#x27;s miscellaneous keyword.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10225,6 +10617,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -10240,7 +10633,7 @@
           &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
           &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10253,6 +10646,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -10268,7 +10662,7 @@
       &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
         { # A person&#x27;s nickname.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10281,6 +10675,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -10290,7 +10685,7 @@
       &quot;occupations&quot;: [ # The person&#x27;s occupations.
         { # A person&#x27;s occupation.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10303,6 +10698,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -10322,7 +10718,7 @@
           &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
           &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10335,6 +10731,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -10354,7 +10751,7 @@
           &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10367,6 +10764,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -10377,7 +10775,7 @@
         { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
           &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10390,6 +10788,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -10399,7 +10798,7 @@
         { # A person&#x27;s relation to another person.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10412,6 +10811,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -10422,7 +10822,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10435,6 +10835,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -10444,7 +10845,7 @@
         { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
           &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10457,6 +10858,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -10466,7 +10868,7 @@
         { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
           &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10479,6 +10881,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -10489,7 +10892,7 @@
         { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10502,6 +10905,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -10511,7 +10915,7 @@
       &quot;skills&quot;: [ # The person&#x27;s skills.
         { # A skill that the person has.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10524,6 +10928,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -10532,7 +10937,7 @@
       &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
         { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10545,6 +10950,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -10554,7 +10960,7 @@
         { # A person&#x27;s associated URLs.
           &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10567,6 +10973,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -10577,7 +10984,7 @@
         { # Arbitrary user data that is populated by the end users.
           &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
           &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-            &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+            &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
             &quot;source&quot;: { # The source of a field. # The source of the field.
               &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
               &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10590,6 +10997,7 @@
               &quot;type&quot;: &quot;A String&quot;, # The source type.
               &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
             },
+            &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
             &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
           },
           &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -10634,7 +11042,7 @@
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10647,6 +11055,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -10661,7 +11070,7 @@
     { # A person&#x27;s age range.
       &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10674,6 +11083,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -10682,7 +11092,7 @@
     { # A person&#x27;s short biography.
       &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10695,6 +11105,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -10708,7 +11119,7 @@
         &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10721,6 +11132,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -10729,7 +11141,7 @@
   &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
     { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10742,6 +11154,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -10751,7 +11164,7 @@
     { # A person&#x27;s calendar URL.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10764,6 +11177,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -10774,7 +11188,7 @@
     { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
       &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10787,6 +11201,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -10796,7 +11211,7 @@
     { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
       &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10809,6 +11224,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -10819,7 +11235,7 @@
       &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10832,6 +11248,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -10848,7 +11265,7 @@
       },
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10861,6 +11278,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -10870,7 +11288,7 @@
     { # An identifier from an external entity related to the person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10883,6 +11301,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -10892,7 +11311,7 @@
   &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
     { # The name that should be used to sort the person in a list.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10905,6 +11324,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -10915,7 +11335,7 @@
       &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10928,6 +11348,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -10938,7 +11359,7 @@
       &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10951,6 +11372,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -10961,7 +11383,7 @@
   &quot;interests&quot;: [ # The person&#x27;s interests.
     { # One of the person&#x27;s interests.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10974,6 +11396,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -10982,7 +11405,7 @@
   &quot;locales&quot;: [ # The person&#x27;s locale preferences.
     { # A person&#x27;s locale preference.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -10995,6 +11418,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -11008,7 +11432,7 @@
       &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
       &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11021,6 +11445,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -11037,7 +11462,7 @@
         &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11050,6 +11475,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -11082,7 +11508,7 @@
     { # A person&#x27;s miscellaneous keyword.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11095,6 +11521,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -11110,7 +11537,7 @@
       &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
       &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11123,6 +11550,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -11138,7 +11566,7 @@
   &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
     { # A person&#x27;s nickname.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11151,6 +11579,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -11160,7 +11589,7 @@
   &quot;occupations&quot;: [ # The person&#x27;s occupations.
     { # A person&#x27;s occupation.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11173,6 +11602,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -11192,7 +11622,7 @@
       &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
       &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11205,6 +11635,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -11224,7 +11655,7 @@
       &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11237,6 +11668,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -11247,7 +11679,7 @@
     { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
       &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11260,6 +11692,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -11269,7 +11702,7 @@
     { # A person&#x27;s relation to another person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11282,6 +11715,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -11292,7 +11726,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11305,6 +11739,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -11314,7 +11749,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11327,6 +11762,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -11336,7 +11772,7 @@
     { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
       &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11349,6 +11785,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -11359,7 +11796,7 @@
     { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11372,6 +11809,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -11381,7 +11819,7 @@
   &quot;skills&quot;: [ # The person&#x27;s skills.
     { # A skill that the person has.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11394,6 +11832,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -11402,7 +11841,7 @@
   &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
     { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11415,6 +11854,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -11424,7 +11864,7 @@
     { # A person&#x27;s associated URLs.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11437,6 +11877,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -11447,7 +11888,7 @@
     { # Arbitrary user data that is populated by the end users.
       &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11460,6 +11901,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -11493,7 +11935,7 @@
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11506,6 +11948,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -11520,7 +11963,7 @@
     { # A person&#x27;s age range.
       &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11533,6 +11976,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -11541,7 +11985,7 @@
     { # A person&#x27;s short biography.
       &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11554,6 +11998,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -11567,7 +12012,7 @@
         &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11580,6 +12025,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -11588,7 +12034,7 @@
   &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
     { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11601,6 +12047,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -11610,7 +12057,7 @@
     { # A person&#x27;s calendar URL.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11623,6 +12070,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -11633,7 +12081,7 @@
     { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
       &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11646,6 +12094,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -11655,7 +12104,7 @@
     { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
       &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11668,6 +12117,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -11678,7 +12128,7 @@
       &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11691,6 +12141,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -11707,7 +12158,7 @@
       },
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11720,6 +12171,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -11729,7 +12181,7 @@
     { # An identifier from an external entity related to the person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11742,6 +12194,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -11751,7 +12204,7 @@
   &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
     { # The name that should be used to sort the person in a list.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11764,6 +12217,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -11774,7 +12228,7 @@
       &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11787,6 +12241,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -11797,7 +12252,7 @@
       &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11810,6 +12265,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -11820,7 +12276,7 @@
   &quot;interests&quot;: [ # The person&#x27;s interests.
     { # One of the person&#x27;s interests.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11833,6 +12289,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -11841,7 +12298,7 @@
   &quot;locales&quot;: [ # The person&#x27;s locale preferences.
     { # A person&#x27;s locale preference.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11854,6 +12311,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -11867,7 +12325,7 @@
       &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
       &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11880,6 +12338,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -11896,7 +12355,7 @@
         &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
       },
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11909,6 +12368,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
     },
@@ -11941,7 +12401,7 @@
     { # A person&#x27;s miscellaneous keyword.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11954,6 +12414,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -11969,7 +12430,7 @@
       &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
       &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -11982,6 +12443,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -11997,7 +12459,7 @@
   &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
     { # A person&#x27;s nickname.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12010,6 +12472,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -12019,7 +12482,7 @@
   &quot;occupations&quot;: [ # The person&#x27;s occupations.
     { # A person&#x27;s occupation.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12032,6 +12495,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -12051,7 +12515,7 @@
       &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
       &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12064,6 +12528,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -12083,7 +12548,7 @@
       &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12096,6 +12561,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -12106,7 +12572,7 @@
     { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
       &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12119,6 +12585,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -12128,7 +12595,7 @@
     { # A person&#x27;s relation to another person.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12141,6 +12608,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -12151,7 +12619,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12164,6 +12632,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -12173,7 +12642,7 @@
     { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
       &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12186,6 +12655,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -12195,7 +12665,7 @@
     { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
       &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12208,6 +12678,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -12218,7 +12689,7 @@
     { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12231,6 +12702,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -12240,7 +12712,7 @@
   &quot;skills&quot;: [ # The person&#x27;s skills.
     { # A skill that the person has.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12253,6 +12725,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -12261,7 +12734,7 @@
   &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
     { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12274,6 +12747,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -12283,7 +12757,7 @@
     { # A person&#x27;s associated URLs.
       &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12296,6 +12770,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -12306,7 +12781,7 @@
     { # Arbitrary user data that is populated by the end users.
       &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
       &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-        &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+        &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
         &quot;source&quot;: { # The source of a field. # The source of the field.
           &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
           &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12319,6 +12794,7 @@
           &quot;type&quot;: &quot;A String&quot;, # The source type.
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
         },
+        &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
         &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
       },
       &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
@@ -12363,7 +12839,7 @@
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;formattedValue&quot;: &quot;A String&quot;, # The unstructured value of the address. If this is not set by the user it will be automatically constructed from structured values.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the address.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12376,6 +12852,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;poBox&quot;: &quot;A String&quot;, # The P.O. box of the address.
@@ -12390,7 +12867,7 @@
       { # A person&#x27;s age range.
         &quot;ageRange&quot;: &quot;A String&quot;, # The age range.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the age range.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12403,6 +12880,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
       },
@@ -12411,7 +12889,7 @@
       { # A person&#x27;s short biography.
         &quot;contentType&quot;: &quot;A String&quot;, # The content type of the biography.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the biography.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12424,6 +12902,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The short biography.
@@ -12437,7 +12916,7 @@
           &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
         },
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the birthday.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12450,6 +12929,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;text&quot;: &quot;A String&quot;, # A free-form string representing the user&#x27;s birthday.
@@ -12458,7 +12938,7 @@
     &quot;braggingRights&quot;: [ # **DEPRECATED**: No data will be returned The person&#x27;s bragging rights.
       { # **DEPRECATED**: No data will be returned A person&#x27;s bragging rights.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the bragging rights.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12471,6 +12951,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The bragging rights; for example, `climbed mount everest`.
@@ -12480,7 +12961,7 @@
       { # A person&#x27;s calendar URL.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the calendar URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the calendar URL.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12493,6 +12974,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the calendar URL. The type can be custom or one of these predefined values: * `home` * `freeBusy` * `work`
@@ -12503,7 +12985,7 @@
       { # Arbitrary client data that is populated by clients. Duplicate keys and values are allowed.
         &quot;key&quot;: &quot;A String&quot;, # The client specified key of the client data.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the client data.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12516,6 +12998,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The client specified value of the client data.
@@ -12525,7 +13008,7 @@
       { # A person&#x27;s cover photo. A large image shown on the person&#x27;s profile page that represents who they are or what they care about.
         &quot;default&quot;: True or False, # True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the cover photo.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12538,6 +13021,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;url&quot;: &quot;A String&quot;, # The URL of the cover photo.
@@ -12548,7 +13032,7 @@
         &quot;displayName&quot;: &quot;A String&quot;, # The display name of the email.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the email address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the email address.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12561,6 +13045,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the email address. The type can be custom or one of these predefined values: * `home` * `work` * `other`
@@ -12577,7 +13062,7 @@
         },
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the event.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12590,6 +13075,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the event. The type can be custom or one of these predefined values: * `anniversary` * `other`
@@ -12599,7 +13085,7 @@
       { # An identifier from an external entity related to the person.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the event translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the external ID.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12612,6 +13098,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the external ID. The type can be custom or one of these predefined values: * `account` * `customer` * `loginId` * `network` * `organization`
@@ -12621,7 +13108,7 @@
     &quot;fileAses&quot;: [ # The person&#x27;s file-ases.
       { # The name that should be used to sort the person in a list.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the file-as.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12634,6 +13121,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The file-as value
@@ -12644,7 +13132,7 @@
         &quot;addressMeAs&quot;: &quot;A String&quot;, # The type of pronouns that should be used to address the person. The value can be custom or one of these predefined values: * `male` * `female` * `other`
         &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the gender translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale. Unspecified or custom value are not localized.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the gender.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12657,6 +13145,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The gender for the person. The gender can be custom or one of these predefined values: * `male` * `female` * `unspecified`
@@ -12667,7 +13156,7 @@
         &quot;formattedProtocol&quot;: &quot;A String&quot;, # Output only. The protocol of the IM client formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the IM client translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the IM client.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12680,6 +13169,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;protocol&quot;: &quot;A String&quot;, # The protocol of the IM client. The protocol can be custom or one of these predefined values: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`
@@ -12690,7 +13180,7 @@
     &quot;interests&quot;: [ # The person&#x27;s interests.
       { # One of the person&#x27;s interests.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the interest.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12703,6 +13193,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The interest; for example, `stargazing`.
@@ -12711,7 +13202,7 @@
     &quot;locales&quot;: [ # The person&#x27;s locale preferences.
       { # A person&#x27;s locale preference.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the locale.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12724,6 +13215,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale.
@@ -12737,7 +13229,7 @@
         &quot;floor&quot;: &quot;A String&quot;, # The floor name or number.
         &quot;floorSection&quot;: &quot;A String&quot;, # The floor section in `floor_name`.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the location.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12750,6 +13242,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the location. The type can be custom or one of these predefined values: * `desk` * `grewUp`
@@ -12766,7 +13259,7 @@
           &quot;inViewerDomain&quot;: True or False, # True if the person is in the viewer&#x27;s Google Workspace domain.
         },
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the membership.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12779,6 +13272,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
       },
@@ -12811,7 +13305,7 @@
       { # A person&#x27;s miscellaneous keyword.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the miscellaneous keyword translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the miscellaneous keyword.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12824,6 +13318,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The miscellaneous keyword type.
@@ -12839,7 +13334,7 @@
         &quot;honorificPrefix&quot;: &quot;A String&quot;, # The honorific prefixes, such as `Mrs.` or `Dr.`
         &quot;honorificSuffix&quot;: &quot;A String&quot;, # The honorific suffixes, such as `Jr.`
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the name.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12852,6 +13347,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;middleName&quot;: &quot;A String&quot;, # The middle name(s).
@@ -12867,7 +13363,7 @@
     &quot;nicknames&quot;: [ # The person&#x27;s nicknames.
       { # A person&#x27;s nickname.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the nickname.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12880,6 +13376,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the nickname.
@@ -12889,7 +13386,7 @@
     &quot;occupations&quot;: [ # The person&#x27;s occupations.
       { # A person&#x27;s occupation.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the occupation.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12902,6 +13399,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The occupation; for example, `carpenter`.
@@ -12921,7 +13419,7 @@
         &quot;jobDescription&quot;: &quot;A String&quot;, # The person&#x27;s job description at the organization.
         &quot;location&quot;: &quot;A String&quot;, # The location of the organization office the person works at.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the organization.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12934,6 +13432,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;name&quot;: &quot;A String&quot;, # The name of the organization.
@@ -12953,7 +13452,7 @@
         &quot;canonicalForm&quot;: &quot;A String&quot;, # Output only. The canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the phone number translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the phone number.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12966,6 +13465,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the phone number. The type can be custom or one of these predefined values: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`
@@ -12976,7 +13476,7 @@
       { # A person&#x27;s photo. A picture shown next to the person&#x27;s name to help others recognize the person.
         &quot;default&quot;: True or False, # True if the photo is a default photo; false if the photo is a user-provided photo.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the photo.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -12989,6 +13489,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;url&quot;: &quot;A String&quot;, # The URL of the photo. You can change the desired size by appending a query parameter `sz={size}` at the end of the url, where {size} is the size in pixels. Example: https://lh3.googleusercontent.com/-T_wVWLlmg7w/AAAAAAAAAAI/AAAAAAAABa8/00gzXvDBYqw/s100/photo.jpg?sz=50
@@ -12998,7 +13499,7 @@
       { # A person&#x27;s relation to another person.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the relation translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relation.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13011,6 +13512,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;person&quot;: &quot;A String&quot;, # The name of the other person this relation refers to.
@@ -13021,7 +13523,7 @@
       { # **DEPRECATED**: No data will be returned A person&#x27;s relationship interest .
         &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship interest translated and formatted in the viewer&#x27;s account locale or the locale specified in the Accept-Language HTTP header.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship interest.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13034,6 +13536,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The kind of relationship the person is looking for. The value can be custom or one of these predefined values: * `friend` * `date` * `relationship` * `networking`
@@ -13043,7 +13546,7 @@
       { # **DEPRECATED**: No data will be returned A person&#x27;s relationship status.
         &quot;formattedValue&quot;: &quot;A String&quot;, # Output only. The value of the relationship status translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the relationship status.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13056,6 +13559,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The relationship status. The value can be custom or one of these predefined values: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`
@@ -13065,7 +13569,7 @@
       { # **DEPRECATED**: Please use `person.locations` instead. A person&#x27;s past or current residence.
         &quot;current&quot;: True or False, # True if the residence is the person&#x27;s current residence; false if the residence is a past residence.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the residence.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13078,6 +13582,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The address of the residence.
@@ -13088,7 +13593,7 @@
       { # A person&#x27;s SIP address. Session Initial Protocol addresses are used for VoIP communications to make voice or video calls over the internet.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the SIP address translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the SIP address.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13101,6 +13606,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the SIP address. The type can be custom or or one of these predefined values: * `home` * `work` * `mobile` * `other`
@@ -13110,7 +13616,7 @@
     &quot;skills&quot;: [ # The person&#x27;s skills.
       { # A skill that the person has.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the skill.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13123,6 +13629,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The skill; for example, `underwater basket weaving`.
@@ -13131,7 +13638,7 @@
     &quot;taglines&quot;: [ # Output only. **DEPRECATED**: No data will be returned The person&#x27;s taglines.
       { # **DEPRECATED**: No data will be returned A brief one-line description of the person.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the tagline.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13144,6 +13651,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The tagline.
@@ -13153,7 +13661,7 @@
       { # A person&#x27;s associated URLs.
         &quot;formattedType&quot;: &quot;A String&quot;, # Output only. The type of the URL translated and formatted in the viewer&#x27;s account locale or the `Accept-Language` HTTP header locale.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the URL.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13166,6 +13674,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;type&quot;: &quot;A String&quot;, # The type of the URL. The type can be custom or one of these predefined values: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Currents application. * `other`
@@ -13176,7 +13685,7 @@
       { # Arbitrary user data that is populated by the end users.
         &quot;key&quot;: &quot;A String&quot;, # The end user specified key of the user defined data.
         &quot;metadata&quot;: { # Metadata about a field. # Metadata about the user defined data.
-          &quot;primary&quot;: True or False, # True if the field is the primary field; false if the field is a secondary field.
+          &quot;primary&quot;: True or False, # True if the field is the primary field for the person.
           &quot;source&quot;: { # The source of a field. # The source of the field.
             &quot;etag&quot;: &quot;A String&quot;, # **Only populated in `person.metadata.sources`.** The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the source. Used for web cache validation.
             &quot;id&quot;: &quot;A String&quot;, # The unique identifier within the source type generated by the server.
@@ -13189,6 +13698,7 @@
             &quot;type&quot;: &quot;A String&quot;, # The source type.
             &quot;updateTime&quot;: &quot;A String&quot;, # Output only. **Only populated in `person.metadata.sources`.** Last update timestamp of this source.
           },
+          &quot;sourcePrimary&quot;: True or False, # True if the field is the primary field for the source.
           &quot;verified&quot;: True or False, # Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.
         },
         &quot;value&quot;: &quot;A String&quot;, # The end user specified value of the user defined data.
diff --git a/docs/dyn/privateca_v1.projects.locations.caPools.certificates.html b/docs/dyn/privateca_v1.projects.locations.caPools.certificates.html
index c09a146..d3f2223 100644
--- a/docs/dyn/privateca_v1.projects.locations.caPools.certificates.html
+++ b/docs/dyn/privateca_v1.projects.locations.caPools.certificates.html
@@ -349,7 +349,7 @@
 
   certificateId: string, Optional. It must be unique within a location and match the regular expression `[a-zA-Z0-9_-]{1,63}`. This field is required when using a CertificateAuthority in the Enterprise CertificateAuthority.Tier, but is optional and its value is ignored otherwise.
   issuingCertificateAuthorityId: string, Optional. The resource ID of the CertificateAuthority that should issue the certificate. This optional field will ignore the load-balancing scheme of the Pool and directly issue the certificate from the CA with the specified ID, contained in the same CaPool referenced by `parent`. Per-CA quota rules apply. If left empty, a CertificateAuthority will be chosen from the CaPool by the service. For example, to issue a Certificate from a Certificate Authority with resource name &quot;projects/my-project/locations/us-central1/caPools/my-pool/certificateAuthorities/my-ca&quot;, you can set the parent to &quot;projects/my-project/locations/us-central1/caPools/my-pool&quot; and the issuing_certificate_authority_id to &quot;my-ca&quot;.
-  requestId: string, Optional. An ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed. The server will guarantee that for at least 60 minutes since the first request. For example, consider a situation where you make an initial request and t he request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments. The request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).
+  requestId: string, Optional. An ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed. The server will guarantee that for at least 60 minutes since the first request. For example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments. The request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).
   validateOnly: boolean, Optional. If this is true, no Certificate resource will be persisted regardless of the CaPool&#x27;s tier, and the returned Certificate will not contain the pem_certificate field.
   x__xgafv: string, V1 error format.
     Allowed values
diff --git a/docs/dyn/privateca_v1beta1.projects.locations.certificateAuthorities.html b/docs/dyn/privateca_v1beta1.projects.locations.certificateAuthorities.html
index ccef4f8..c8ce851 100644
--- a/docs/dyn/privateca_v1beta1.projects.locations.certificateAuthorities.html
+++ b/docs/dyn/privateca_v1beta1.projects.locations.certificateAuthorities.html
@@ -143,7 +143,7 @@
   &quot;pemCaCertificate&quot;: &quot;A String&quot;, # Required. The signed CA certificate issued from FetchCertificateAuthorityCsrResponse.pem_csr.
   &quot;requestId&quot;: &quot;A String&quot;, # Optional. An ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed. The server will guarantee that for at least 60 minutes since the first request. For example, consider a situation where you make an initial request and t he request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments. The request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).
   &quot;subordinateConfig&quot;: { # Describes a subordinate CA&#x27;s issuers. This is either a resource path to a known issuing CertificateAuthority, or a PEM issuer certificate chain. # Required. Must include information about the issuer of &#x27;pem_ca_certificate&#x27;, and any further issuers until the self-signed CA.
-    &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority in the same project that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
+    &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
     &quot;pemIssuerChain&quot;: { # This message describes a subordinate CA&#x27;s issuer certificate chain. This wrapper exists for compatibility reasons. # Required. Contains the PEM certificate chain for the issuers of this CertificateAuthority, but not pem certificate for this CA itself.
       &quot;pemCertificates&quot;: [ # Required. Expected to be in leaf-to-root order according to RFC 5246.
         &quot;A String&quot;,
@@ -598,7 +598,7 @@
   ],
   &quot;state&quot;: &quot;A String&quot;, # Output only. The State for this CertificateAuthority.
   &quot;subordinateConfig&quot;: { # Describes a subordinate CA&#x27;s issuers. This is either a resource path to a known issuing CertificateAuthority, or a PEM issuer certificate chain. # Optional. If this is a subordinate CertificateAuthority, this field will be set with the subordinate configuration, which describes its issuers. This may be updated, but this CertificateAuthority must continue to validate.
-    &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority in the same project that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
+    &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
     &quot;pemIssuerChain&quot;: { # This message describes a subordinate CA&#x27;s issuer certificate chain. This wrapper exists for compatibility reasons. # Required. Contains the PEM certificate chain for the issuers of this CertificateAuthority, but not pem certificate for this CA itself.
       &quot;pemCertificates&quot;: [ # Required. Expected to be in leaf-to-root order according to RFC 5246.
         &quot;A String&quot;,
@@ -1161,7 +1161,7 @@
   ],
   &quot;state&quot;: &quot;A String&quot;, # Output only. The State for this CertificateAuthority.
   &quot;subordinateConfig&quot;: { # Describes a subordinate CA&#x27;s issuers. This is either a resource path to a known issuing CertificateAuthority, or a PEM issuer certificate chain. # Optional. If this is a subordinate CertificateAuthority, this field will be set with the subordinate configuration, which describes its issuers. This may be updated, but this CertificateAuthority must continue to validate.
-    &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority in the same project that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
+    &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
     &quot;pemIssuerChain&quot;: { # This message describes a subordinate CA&#x27;s issuer certificate chain. This wrapper exists for compatibility reasons. # Required. Contains the PEM certificate chain for the issuers of this CertificateAuthority, but not pem certificate for this CA itself.
       &quot;pemCertificates&quot;: [ # Required. Expected to be in leaf-to-root order according to RFC 5246.
         &quot;A String&quot;,
@@ -1645,7 +1645,7 @@
       ],
       &quot;state&quot;: &quot;A String&quot;, # Output only. The State for this CertificateAuthority.
       &quot;subordinateConfig&quot;: { # Describes a subordinate CA&#x27;s issuers. This is either a resource path to a known issuing CertificateAuthority, or a PEM issuer certificate chain. # Optional. If this is a subordinate CertificateAuthority, this field will be set with the subordinate configuration, which describes its issuers. This may be updated, but this CertificateAuthority must continue to validate.
-        &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority in the same project that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
+        &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
         &quot;pemIssuerChain&quot;: { # This message describes a subordinate CA&#x27;s issuer certificate chain. This wrapper exists for compatibility reasons. # Required. Contains the PEM certificate chain for the issuers of this CertificateAuthority, but not pem certificate for this CA itself.
           &quot;pemCertificates&quot;: [ # Required. Expected to be in leaf-to-root order according to RFC 5246.
             &quot;A String&quot;,
@@ -2090,7 +2090,7 @@
   ],
   &quot;state&quot;: &quot;A String&quot;, # Output only. The State for this CertificateAuthority.
   &quot;subordinateConfig&quot;: { # Describes a subordinate CA&#x27;s issuers. This is either a resource path to a known issuing CertificateAuthority, or a PEM issuer certificate chain. # Optional. If this is a subordinate CertificateAuthority, this field will be set with the subordinate configuration, which describes its issuers. This may be updated, but this CertificateAuthority must continue to validate.
-    &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority in the same project that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
+    &quot;certificateAuthority&quot;: &quot;A String&quot;, # Required. This can refer to a CertificateAuthority that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.
     &quot;pemIssuerChain&quot;: { # This message describes a subordinate CA&#x27;s issuer certificate chain. This wrapper exists for compatibility reasons. # Required. Contains the PEM certificate chain for the issuers of this CertificateAuthority, but not pem certificate for this CA itself.
       &quot;pemCertificates&quot;: [ # Required. Expected to be in leaf-to-root order according to RFC 5246.
         &quot;A String&quot;,
diff --git a/docs/dyn/reseller_v1.customers.html b/docs/dyn/reseller_v1.customers.html
index ccfb5e4..85b8c6c 100644
--- a/docs/dyn/reseller_v1.customers.html
+++ b/docs/dyn/reseller_v1.customers.html
@@ -79,16 +79,16 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#get">get(customerId, x__xgafv=None)</a></code></p>
-<p class="firstline">Get a customer account. Use this operation to see a customer account already in your reseller management, or to see the minimal account information for an existing customer that you do not manage. For more information about the API response for existing customers, see [retrieving a customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#get_customer).</p>
+<p class="firstline">Gets a customer account. Use this operation to see a customer account already in your reseller management, or to see the minimal account information for an existing customer that you do not manage. For more information about the API response for existing customers, see [retrieving a customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#get_customer).</p>
 <p class="toc_element">
   <code><a href="#insert">insert(body=None, customerAuthToken=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Order a new customer's account. Before ordering a new customer account, establish whether the customer account already exists using the [`customers.get`](/admin-sdk/reseller/v1/reference/customers/get) If the customer account exists as a direct Google account or as a resold customer account from another reseller, use the `customerAuthToken\` as described in [order a resold account for an existing customer](/admin-sdk/reseller/v1/how-tos/manage_customers#create_existing_customer). For more information about ordering a new customer account, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#create_customer). After creating a new customer account, you must provision a user as an administrator. The customer's administrator is required to sign in to the Admin console and sign the G Suite via Reseller agreement to activate the account. Resellers are prohibited from signing the G Suite via Reseller agreement on the customer's behalf. For more information, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#tos).</p>
+<p class="firstline">Orders a new customer's account. Before ordering a new customer account, establish whether the customer account already exists using the [`customers.get`](/admin-sdk/reseller/v1/reference/customers/get) If the customer account exists as a direct Google account or as a resold customer account from another reseller, use the `customerAuthToken\` as described in [order a resold account for an existing customer](/admin-sdk/reseller/v1/how-tos/manage_customers#create_existing_customer). For more information about ordering a new customer account, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#create_customer). After creating a new customer account, you must provision a user as an administrator. The customer's administrator is required to sign in to the Admin console and sign the G Suite via Reseller agreement to activate the account. Resellers are prohibited from signing the G Suite via Reseller agreement on the customer's behalf. For more information, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#tos).</p>
 <p class="toc_element">
   <code><a href="#patch">patch(customerId, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Update a customer account's settings. This method supports patch semantics.</p>
+<p class="firstline">Updates a customer account's settings. This method supports patch semantics. You cannot update `customerType` via the Reseller API, but a `"team"` customer can verify their domain and become `customerType = "domain"`. For more information, see [Verify your domain to unlock Essentials features](https://support.google.com/a/answer/9122284).</p>
 <p class="toc_element">
   <code><a href="#update">update(customerId, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Update a customer account's settings. For more information, see [update a customer's settings](/admin-sdk/reseller/v1/how-tos/manage_customers#update_customer).</p>
+<p class="firstline">Updates a customer account's settings. You cannot update `customerType` via the Reseller API, but a `"team"` customer can verify their domain and become `customerType = "domain"`. For more information, see [update a customer's settings](/admin-sdk/reseller/v1/how-tos/manage_customers#update_customer).</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -97,7 +97,7 @@
 
 <div class="method">
     <code class="details" id="get">get(customerId, x__xgafv=None)</code>
-  <pre>Get a customer account. Use this operation to see a customer account already in your reseller management, or to see the minimal account information for an existing customer that you do not manage. For more information about the API response for existing customers, see [retrieving a customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#get_customer).
+  <pre>Gets a customer account. Use this operation to see a customer account already in your reseller management, or to see the minimal account information for an existing customer that you do not manage. For more information about the API response for existing customers, see [retrieving a customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#get_customer).
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -110,11 +110,11 @@
   An object of the form:
 
     { # When a Google customer&#x27;s account is registered with a reseller, the customer&#x27;s subscriptions for Google services are managed by this reseller. A customer is described by a primary domain name and a physical address.
-  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new customer and should not use the same domain as `customerDomain`.
+  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new &quot;domain&quot; customer and should not use the same domain as `customerDomain`. The `alternateEmail` field is not necessary to create a &quot;team&quot; customer.
   &quot;customerDomain&quot;: &quot;A String&quot;, # The customer&#x27;s primary domain name string. `customerDomain` is required when creating a new customer. Do not include the `www` prefix in the domain when adding a customer.
   &quot;customerDomainVerified&quot;: True or False, # Whether the customer&#x27;s primary domain has been verified.
   &quot;customerId&quot;: &quot;A String&quot;, # This property will always be returned in a response as the unique identifier generated by Google. In a request, this property can be either the primary domain or the unique identifier generated by Google.
-  &quot;customerType&quot;: &quot;A String&quot;, # The type of the customer (DOMAIN or TEAM), default is DOMAIN.
+  &quot;customerType&quot;: &quot;A String&quot;, # Identifies the type of the customer. Acceptable values include: * `domain`: Implies a domain-verified customer (default). * `team`: Implies an email-verified customer. For more information, see [managed teams](https://support.google.com/a/users/answer/9939479).
   &quot;kind&quot;: &quot;reseller#customer&quot;, # Identifies the resource as a customer. Value: `reseller#customer`
   &quot;phoneNumber&quot;: &quot;A String&quot;, # Customer contact phone number. Must start with &quot;+&quot; followed by the country code. The rest of the number can be contiguous numbers or respect the phone local format conventions, but it must be a real phone number and not, for example, &quot;123&quot;. This field is silently ignored if invalid.
   &quot;postalAddress&quot;: { # JSON template for address of a customer. # A customer&#x27;s address information. Each field has a limit of 255 charcters.
@@ -130,7 +130,7 @@
     &quot;region&quot;: &quot;A String&quot;, # An example of a `region` value is `CA` for the state of California.
   },
   &quot;primaryAdmin&quot;: { # JSON template for primary admin in case of TEAM customers # The first admin details of the customer, present in case of TEAM customer.
-    &quot;primaryEmail&quot;: &quot;A String&quot;, # Primary admin&#x27;s domained email This email&#x27;s domain will be used to create TEAM customer
+    &quot;primaryEmail&quot;: &quot;A String&quot;, # The business email of the primary administrator of the customer. The email verification link is sent to this email address at the time of customer creation. Primary administrators have access to the customer&#x27;s Admin Console, including the ability to invite and evict users and manage the administrative needs of the customer.
   },
   &quot;resourceUiUrl&quot;: &quot;A String&quot;, # URL to customer&#x27;s Admin console dashboard. The read-only URL is generated by the API service. This is used if your client application requires the customer to complete a task in the Admin console.
 }</pre>
@@ -138,18 +138,18 @@
 
 <div class="method">
     <code class="details" id="insert">insert(body=None, customerAuthToken=None, x__xgafv=None)</code>
-  <pre>Order a new customer&#x27;s account. Before ordering a new customer account, establish whether the customer account already exists using the [`customers.get`](/admin-sdk/reseller/v1/reference/customers/get) If the customer account exists as a direct Google account or as a resold customer account from another reseller, use the `customerAuthToken\` as described in [order a resold account for an existing customer](/admin-sdk/reseller/v1/how-tos/manage_customers#create_existing_customer). For more information about ordering a new customer account, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#create_customer). After creating a new customer account, you must provision a user as an administrator. The customer&#x27;s administrator is required to sign in to the Admin console and sign the G Suite via Reseller agreement to activate the account. Resellers are prohibited from signing the G Suite via Reseller agreement on the customer&#x27;s behalf. For more information, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#tos).
+  <pre>Orders a new customer&#x27;s account. Before ordering a new customer account, establish whether the customer account already exists using the [`customers.get`](/admin-sdk/reseller/v1/reference/customers/get) If the customer account exists as a direct Google account or as a resold customer account from another reseller, use the `customerAuthToken\` as described in [order a resold account for an existing customer](/admin-sdk/reseller/v1/how-tos/manage_customers#create_existing_customer). For more information about ordering a new customer account, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#create_customer). After creating a new customer account, you must provision a user as an administrator. The customer&#x27;s administrator is required to sign in to the Admin console and sign the G Suite via Reseller agreement to activate the account. Resellers are prohibited from signing the G Suite via Reseller agreement on the customer&#x27;s behalf. For more information, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#tos).
 
 Args:
   body: object, The request body.
     The object takes the form of:
 
 { # When a Google customer&#x27;s account is registered with a reseller, the customer&#x27;s subscriptions for Google services are managed by this reseller. A customer is described by a primary domain name and a physical address.
-  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new customer and should not use the same domain as `customerDomain`.
+  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new &quot;domain&quot; customer and should not use the same domain as `customerDomain`. The `alternateEmail` field is not necessary to create a &quot;team&quot; customer.
   &quot;customerDomain&quot;: &quot;A String&quot;, # The customer&#x27;s primary domain name string. `customerDomain` is required when creating a new customer. Do not include the `www` prefix in the domain when adding a customer.
   &quot;customerDomainVerified&quot;: True or False, # Whether the customer&#x27;s primary domain has been verified.
   &quot;customerId&quot;: &quot;A String&quot;, # This property will always be returned in a response as the unique identifier generated by Google. In a request, this property can be either the primary domain or the unique identifier generated by Google.
-  &quot;customerType&quot;: &quot;A String&quot;, # The type of the customer (DOMAIN or TEAM), default is DOMAIN.
+  &quot;customerType&quot;: &quot;A String&quot;, # Identifies the type of the customer. Acceptable values include: * `domain`: Implies a domain-verified customer (default). * `team`: Implies an email-verified customer. For more information, see [managed teams](https://support.google.com/a/users/answer/9939479).
   &quot;kind&quot;: &quot;reseller#customer&quot;, # Identifies the resource as a customer. Value: `reseller#customer`
   &quot;phoneNumber&quot;: &quot;A String&quot;, # Customer contact phone number. Must start with &quot;+&quot; followed by the country code. The rest of the number can be contiguous numbers or respect the phone local format conventions, but it must be a real phone number and not, for example, &quot;123&quot;. This field is silently ignored if invalid.
   &quot;postalAddress&quot;: { # JSON template for address of a customer. # A customer&#x27;s address information. Each field has a limit of 255 charcters.
@@ -165,7 +165,7 @@
     &quot;region&quot;: &quot;A String&quot;, # An example of a `region` value is `CA` for the state of California.
   },
   &quot;primaryAdmin&quot;: { # JSON template for primary admin in case of TEAM customers # The first admin details of the customer, present in case of TEAM customer.
-    &quot;primaryEmail&quot;: &quot;A String&quot;, # Primary admin&#x27;s domained email This email&#x27;s domain will be used to create TEAM customer
+    &quot;primaryEmail&quot;: &quot;A String&quot;, # The business email of the primary administrator of the customer. The email verification link is sent to this email address at the time of customer creation. Primary administrators have access to the customer&#x27;s Admin Console, including the ability to invite and evict users and manage the administrative needs of the customer.
   },
   &quot;resourceUiUrl&quot;: &quot;A String&quot;, # URL to customer&#x27;s Admin console dashboard. The read-only URL is generated by the API service. This is used if your client application requires the customer to complete a task in the Admin console.
 }
@@ -180,11 +180,11 @@
   An object of the form:
 
     { # When a Google customer&#x27;s account is registered with a reseller, the customer&#x27;s subscriptions for Google services are managed by this reseller. A customer is described by a primary domain name and a physical address.
-  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new customer and should not use the same domain as `customerDomain`.
+  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new &quot;domain&quot; customer and should not use the same domain as `customerDomain`. The `alternateEmail` field is not necessary to create a &quot;team&quot; customer.
   &quot;customerDomain&quot;: &quot;A String&quot;, # The customer&#x27;s primary domain name string. `customerDomain` is required when creating a new customer. Do not include the `www` prefix in the domain when adding a customer.
   &quot;customerDomainVerified&quot;: True or False, # Whether the customer&#x27;s primary domain has been verified.
   &quot;customerId&quot;: &quot;A String&quot;, # This property will always be returned in a response as the unique identifier generated by Google. In a request, this property can be either the primary domain or the unique identifier generated by Google.
-  &quot;customerType&quot;: &quot;A String&quot;, # The type of the customer (DOMAIN or TEAM), default is DOMAIN.
+  &quot;customerType&quot;: &quot;A String&quot;, # Identifies the type of the customer. Acceptable values include: * `domain`: Implies a domain-verified customer (default). * `team`: Implies an email-verified customer. For more information, see [managed teams](https://support.google.com/a/users/answer/9939479).
   &quot;kind&quot;: &quot;reseller#customer&quot;, # Identifies the resource as a customer. Value: `reseller#customer`
   &quot;phoneNumber&quot;: &quot;A String&quot;, # Customer contact phone number. Must start with &quot;+&quot; followed by the country code. The rest of the number can be contiguous numbers or respect the phone local format conventions, but it must be a real phone number and not, for example, &quot;123&quot;. This field is silently ignored if invalid.
   &quot;postalAddress&quot;: { # JSON template for address of a customer. # A customer&#x27;s address information. Each field has a limit of 255 charcters.
@@ -200,7 +200,7 @@
     &quot;region&quot;: &quot;A String&quot;, # An example of a `region` value is `CA` for the state of California.
   },
   &quot;primaryAdmin&quot;: { # JSON template for primary admin in case of TEAM customers # The first admin details of the customer, present in case of TEAM customer.
-    &quot;primaryEmail&quot;: &quot;A String&quot;, # Primary admin&#x27;s domained email This email&#x27;s domain will be used to create TEAM customer
+    &quot;primaryEmail&quot;: &quot;A String&quot;, # The business email of the primary administrator of the customer. The email verification link is sent to this email address at the time of customer creation. Primary administrators have access to the customer&#x27;s Admin Console, including the ability to invite and evict users and manage the administrative needs of the customer.
   },
   &quot;resourceUiUrl&quot;: &quot;A String&quot;, # URL to customer&#x27;s Admin console dashboard. The read-only URL is generated by the API service. This is used if your client application requires the customer to complete a task in the Admin console.
 }</pre>
@@ -208,7 +208,7 @@
 
 <div class="method">
     <code class="details" id="patch">patch(customerId, body=None, x__xgafv=None)</code>
-  <pre>Update a customer account&#x27;s settings. This method supports patch semantics.
+  <pre>Updates a customer account&#x27;s settings. This method supports patch semantics. You cannot update `customerType` via the Reseller API, but a `&quot;team&quot;` customer can verify their domain and become `customerType = &quot;domain&quot;`. For more information, see [Verify your domain to unlock Essentials features](https://support.google.com/a/answer/9122284).
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -216,11 +216,11 @@
     The object takes the form of:
 
 { # When a Google customer&#x27;s account is registered with a reseller, the customer&#x27;s subscriptions for Google services are managed by this reseller. A customer is described by a primary domain name and a physical address.
-  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new customer and should not use the same domain as `customerDomain`.
+  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new &quot;domain&quot; customer and should not use the same domain as `customerDomain`. The `alternateEmail` field is not necessary to create a &quot;team&quot; customer.
   &quot;customerDomain&quot;: &quot;A String&quot;, # The customer&#x27;s primary domain name string. `customerDomain` is required when creating a new customer. Do not include the `www` prefix in the domain when adding a customer.
   &quot;customerDomainVerified&quot;: True or False, # Whether the customer&#x27;s primary domain has been verified.
   &quot;customerId&quot;: &quot;A String&quot;, # This property will always be returned in a response as the unique identifier generated by Google. In a request, this property can be either the primary domain or the unique identifier generated by Google.
-  &quot;customerType&quot;: &quot;A String&quot;, # The type of the customer (DOMAIN or TEAM), default is DOMAIN.
+  &quot;customerType&quot;: &quot;A String&quot;, # Identifies the type of the customer. Acceptable values include: * `domain`: Implies a domain-verified customer (default). * `team`: Implies an email-verified customer. For more information, see [managed teams](https://support.google.com/a/users/answer/9939479).
   &quot;kind&quot;: &quot;reseller#customer&quot;, # Identifies the resource as a customer. Value: `reseller#customer`
   &quot;phoneNumber&quot;: &quot;A String&quot;, # Customer contact phone number. Must start with &quot;+&quot; followed by the country code. The rest of the number can be contiguous numbers or respect the phone local format conventions, but it must be a real phone number and not, for example, &quot;123&quot;. This field is silently ignored if invalid.
   &quot;postalAddress&quot;: { # JSON template for address of a customer. # A customer&#x27;s address information. Each field has a limit of 255 charcters.
@@ -236,7 +236,7 @@
     &quot;region&quot;: &quot;A String&quot;, # An example of a `region` value is `CA` for the state of California.
   },
   &quot;primaryAdmin&quot;: { # JSON template for primary admin in case of TEAM customers # The first admin details of the customer, present in case of TEAM customer.
-    &quot;primaryEmail&quot;: &quot;A String&quot;, # Primary admin&#x27;s domained email This email&#x27;s domain will be used to create TEAM customer
+    &quot;primaryEmail&quot;: &quot;A String&quot;, # The business email of the primary administrator of the customer. The email verification link is sent to this email address at the time of customer creation. Primary administrators have access to the customer&#x27;s Admin Console, including the ability to invite and evict users and manage the administrative needs of the customer.
   },
   &quot;resourceUiUrl&quot;: &quot;A String&quot;, # URL to customer&#x27;s Admin console dashboard. The read-only URL is generated by the API service. This is used if your client application requires the customer to complete a task in the Admin console.
 }
@@ -250,11 +250,11 @@
   An object of the form:
 
     { # When a Google customer&#x27;s account is registered with a reseller, the customer&#x27;s subscriptions for Google services are managed by this reseller. A customer is described by a primary domain name and a physical address.
-  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new customer and should not use the same domain as `customerDomain`.
+  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new &quot;domain&quot; customer and should not use the same domain as `customerDomain`. The `alternateEmail` field is not necessary to create a &quot;team&quot; customer.
   &quot;customerDomain&quot;: &quot;A String&quot;, # The customer&#x27;s primary domain name string. `customerDomain` is required when creating a new customer. Do not include the `www` prefix in the domain when adding a customer.
   &quot;customerDomainVerified&quot;: True or False, # Whether the customer&#x27;s primary domain has been verified.
   &quot;customerId&quot;: &quot;A String&quot;, # This property will always be returned in a response as the unique identifier generated by Google. In a request, this property can be either the primary domain or the unique identifier generated by Google.
-  &quot;customerType&quot;: &quot;A String&quot;, # The type of the customer (DOMAIN or TEAM), default is DOMAIN.
+  &quot;customerType&quot;: &quot;A String&quot;, # Identifies the type of the customer. Acceptable values include: * `domain`: Implies a domain-verified customer (default). * `team`: Implies an email-verified customer. For more information, see [managed teams](https://support.google.com/a/users/answer/9939479).
   &quot;kind&quot;: &quot;reseller#customer&quot;, # Identifies the resource as a customer. Value: `reseller#customer`
   &quot;phoneNumber&quot;: &quot;A String&quot;, # Customer contact phone number. Must start with &quot;+&quot; followed by the country code. The rest of the number can be contiguous numbers or respect the phone local format conventions, but it must be a real phone number and not, for example, &quot;123&quot;. This field is silently ignored if invalid.
   &quot;postalAddress&quot;: { # JSON template for address of a customer. # A customer&#x27;s address information. Each field has a limit of 255 charcters.
@@ -270,7 +270,7 @@
     &quot;region&quot;: &quot;A String&quot;, # An example of a `region` value is `CA` for the state of California.
   },
   &quot;primaryAdmin&quot;: { # JSON template for primary admin in case of TEAM customers # The first admin details of the customer, present in case of TEAM customer.
-    &quot;primaryEmail&quot;: &quot;A String&quot;, # Primary admin&#x27;s domained email This email&#x27;s domain will be used to create TEAM customer
+    &quot;primaryEmail&quot;: &quot;A String&quot;, # The business email of the primary administrator of the customer. The email verification link is sent to this email address at the time of customer creation. Primary administrators have access to the customer&#x27;s Admin Console, including the ability to invite and evict users and manage the administrative needs of the customer.
   },
   &quot;resourceUiUrl&quot;: &quot;A String&quot;, # URL to customer&#x27;s Admin console dashboard. The read-only URL is generated by the API service. This is used if your client application requires the customer to complete a task in the Admin console.
 }</pre>
@@ -278,7 +278,7 @@
 
 <div class="method">
     <code class="details" id="update">update(customerId, body=None, x__xgafv=None)</code>
-  <pre>Update a customer account&#x27;s settings. For more information, see [update a customer&#x27;s settings](/admin-sdk/reseller/v1/how-tos/manage_customers#update_customer).
+  <pre>Updates a customer account&#x27;s settings. You cannot update `customerType` via the Reseller API, but a `&quot;team&quot;` customer can verify their domain and become `customerType = &quot;domain&quot;`. For more information, see [update a customer&#x27;s settings](/admin-sdk/reseller/v1/how-tos/manage_customers#update_customer).
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -286,11 +286,11 @@
     The object takes the form of:
 
 { # When a Google customer&#x27;s account is registered with a reseller, the customer&#x27;s subscriptions for Google services are managed by this reseller. A customer is described by a primary domain name and a physical address.
-  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new customer and should not use the same domain as `customerDomain`.
+  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new &quot;domain&quot; customer and should not use the same domain as `customerDomain`. The `alternateEmail` field is not necessary to create a &quot;team&quot; customer.
   &quot;customerDomain&quot;: &quot;A String&quot;, # The customer&#x27;s primary domain name string. `customerDomain` is required when creating a new customer. Do not include the `www` prefix in the domain when adding a customer.
   &quot;customerDomainVerified&quot;: True or False, # Whether the customer&#x27;s primary domain has been verified.
   &quot;customerId&quot;: &quot;A String&quot;, # This property will always be returned in a response as the unique identifier generated by Google. In a request, this property can be either the primary domain or the unique identifier generated by Google.
-  &quot;customerType&quot;: &quot;A String&quot;, # The type of the customer (DOMAIN or TEAM), default is DOMAIN.
+  &quot;customerType&quot;: &quot;A String&quot;, # Identifies the type of the customer. Acceptable values include: * `domain`: Implies a domain-verified customer (default). * `team`: Implies an email-verified customer. For more information, see [managed teams](https://support.google.com/a/users/answer/9939479).
   &quot;kind&quot;: &quot;reseller#customer&quot;, # Identifies the resource as a customer. Value: `reseller#customer`
   &quot;phoneNumber&quot;: &quot;A String&quot;, # Customer contact phone number. Must start with &quot;+&quot; followed by the country code. The rest of the number can be contiguous numbers or respect the phone local format conventions, but it must be a real phone number and not, for example, &quot;123&quot;. This field is silently ignored if invalid.
   &quot;postalAddress&quot;: { # JSON template for address of a customer. # A customer&#x27;s address information. Each field has a limit of 255 charcters.
@@ -306,7 +306,7 @@
     &quot;region&quot;: &quot;A String&quot;, # An example of a `region` value is `CA` for the state of California.
   },
   &quot;primaryAdmin&quot;: { # JSON template for primary admin in case of TEAM customers # The first admin details of the customer, present in case of TEAM customer.
-    &quot;primaryEmail&quot;: &quot;A String&quot;, # Primary admin&#x27;s domained email This email&#x27;s domain will be used to create TEAM customer
+    &quot;primaryEmail&quot;: &quot;A String&quot;, # The business email of the primary administrator of the customer. The email verification link is sent to this email address at the time of customer creation. Primary administrators have access to the customer&#x27;s Admin Console, including the ability to invite and evict users and manage the administrative needs of the customer.
   },
   &quot;resourceUiUrl&quot;: &quot;A String&quot;, # URL to customer&#x27;s Admin console dashboard. The read-only URL is generated by the API service. This is used if your client application requires the customer to complete a task in the Admin console.
 }
@@ -320,11 +320,11 @@
   An object of the form:
 
     { # When a Google customer&#x27;s account is registered with a reseller, the customer&#x27;s subscriptions for Google services are managed by this reseller. A customer is described by a primary domain name and a physical address.
-  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new customer and should not use the same domain as `customerDomain`.
+  &quot;alternateEmail&quot;: &quot;A String&quot;, # Like the &quot;Customer email&quot; in the reseller tools, this email is the secondary contact used if something happens to the customer&#x27;s service such as service outage or a security issue. This property is required when creating a new &quot;domain&quot; customer and should not use the same domain as `customerDomain`. The `alternateEmail` field is not necessary to create a &quot;team&quot; customer.
   &quot;customerDomain&quot;: &quot;A String&quot;, # The customer&#x27;s primary domain name string. `customerDomain` is required when creating a new customer. Do not include the `www` prefix in the domain when adding a customer.
   &quot;customerDomainVerified&quot;: True or False, # Whether the customer&#x27;s primary domain has been verified.
   &quot;customerId&quot;: &quot;A String&quot;, # This property will always be returned in a response as the unique identifier generated by Google. In a request, this property can be either the primary domain or the unique identifier generated by Google.
-  &quot;customerType&quot;: &quot;A String&quot;, # The type of the customer (DOMAIN or TEAM), default is DOMAIN.
+  &quot;customerType&quot;: &quot;A String&quot;, # Identifies the type of the customer. Acceptable values include: * `domain`: Implies a domain-verified customer (default). * `team`: Implies an email-verified customer. For more information, see [managed teams](https://support.google.com/a/users/answer/9939479).
   &quot;kind&quot;: &quot;reseller#customer&quot;, # Identifies the resource as a customer. Value: `reseller#customer`
   &quot;phoneNumber&quot;: &quot;A String&quot;, # Customer contact phone number. Must start with &quot;+&quot; followed by the country code. The rest of the number can be contiguous numbers or respect the phone local format conventions, but it must be a real phone number and not, for example, &quot;123&quot;. This field is silently ignored if invalid.
   &quot;postalAddress&quot;: { # JSON template for address of a customer. # A customer&#x27;s address information. Each field has a limit of 255 charcters.
@@ -340,7 +340,7 @@
     &quot;region&quot;: &quot;A String&quot;, # An example of a `region` value is `CA` for the state of California.
   },
   &quot;primaryAdmin&quot;: { # JSON template for primary admin in case of TEAM customers # The first admin details of the customer, present in case of TEAM customer.
-    &quot;primaryEmail&quot;: &quot;A String&quot;, # Primary admin&#x27;s domained email This email&#x27;s domain will be used to create TEAM customer
+    &quot;primaryEmail&quot;: &quot;A String&quot;, # The business email of the primary administrator of the customer. The email verification link is sent to this email address at the time of customer creation. Primary administrators have access to the customer&#x27;s Admin Console, including the ability to invite and evict users and manage the administrative needs of the customer.
   },
   &quot;resourceUiUrl&quot;: &quot;A String&quot;, # URL to customer&#x27;s Admin console dashboard. The read-only URL is generated by the API service. This is used if your client application requires the customer to complete a task in the Admin console.
 }</pre>
diff --git a/docs/dyn/reseller_v1.subscriptions.html b/docs/dyn/reseller_v1.subscriptions.html
index fd4d83a..e00164a 100644
--- a/docs/dyn/reseller_v1.subscriptions.html
+++ b/docs/dyn/reseller_v1.subscriptions.html
@@ -79,28 +79,28 @@
 <p class="firstline">Activates a subscription previously suspended by the reseller. If you did not suspend the customer subscription and it is suspended for any other reason, such as for abuse or a pending ToS acceptance, this call will not reactivate the customer subscription.</p>
 <p class="toc_element">
   <code><a href="#changePlan">changePlan(customerId, subscriptionId, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Update a subscription plan. Use this method to update a plan for a 30-day trial or a flexible plan subscription to an annual commitment plan with monthly or yearly payments. How a plan is updated differs depending on the plan and the products. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_plan).</p>
+<p class="firstline">Updates a subscription plan. Use this method to update a plan for a 30-day trial or a flexible plan subscription to an annual commitment plan with monthly or yearly payments. How a plan is updated differs depending on the plan and the products. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_plan).</p>
 <p class="toc_element">
   <code><a href="#changeRenewalSettings">changeRenewalSettings(customerId, subscriptionId, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Update a user license's renewal settings. This is applicable for accounts with annual commitment plans only. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_renewal).</p>
+<p class="firstline">Updates a user license's renewal settings. This is applicable for accounts with annual commitment plans only. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_renewal).</p>
 <p class="toc_element">
   <code><a href="#changeSeats">changeSeats(customerId, subscriptionId, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Update a subscription's user license settings. For more information about updating an annual commitment plan or a flexible plan subscription’s licenses, see [Manage Subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_seat).</p>
+<p class="firstline">Updates a subscription's user license settings. For more information about updating an annual commitment plan or a flexible plan subscription’s licenses, see [Manage Subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_seat).</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="#delete">delete(customerId, subscriptionId, deletionType, x__xgafv=None)</a></code></p>
-<p class="firstline">Cancel, suspend, or transfer a subscription to direct.</p>
+<p class="firstline">Cancels, suspends, or transfers a subscription to direct.</p>
 <p class="toc_element">
   <code><a href="#get">get(customerId, subscriptionId, x__xgafv=None)</a></code></p>
-<p class="firstline">Get a specific subscription. The `subscriptionId` can be found using the [Retrieve all reseller subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_all_subscriptions) method. For more information about retrieving a specific subscription, see the information descrived in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_subscription).</p>
+<p class="firstline">Gets a specific subscription. The `subscriptionId` can be found using the [Retrieve all reseller subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_all_subscriptions) method. For more information about retrieving a specific subscription, see the information descrived in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_subscription).</p>
 <p class="toc_element">
   <code><a href="#insert">insert(customerId, body=None, customerAuthToken=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Create or transfer a subscription. Create a subscription for a customer's account that you ordered using the [Order a new customer account](/admin-sdk/reseller/v1/reference/customers/insert.html) method. For more information about creating a subscription for different payment plans, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#create_subscription).\ If you did not order the customer's account using the customer insert method, use the customer's `customerAuthToken` when creating a subscription for that customer. If transferring a G Suite subscription with an associated Google Drive or Google Vault subscription, use the [batch operation](/admin-sdk/reseller/v1/how-tos/batch.html) to transfer all of these subscriptions. For more information, see how to [transfer subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#transfer_a_subscription).</p>
+<p class="firstline">Creates or transfer a subscription. Create a subscription for a customer's account that you ordered using the [Order a new customer account](/admin-sdk/reseller/v1/reference/customers/insert.html) method. For more information about creating a subscription for different payment plans, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#create_subscription).\ If you did not order the customer's account using the customer insert method, use the customer's `customerAuthToken` when creating a subscription for that customer. If transferring a G Suite subscription with an associated Google Drive or Google Vault subscription, use the [batch operation](/admin-sdk/reseller/v1/how-tos/batch.html) to transfer all of these subscriptions. For more information, see how to [transfer subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#transfer_a_subscription).</p>
 <p class="toc_element">
   <code><a href="#list">list(customerAuthToken=None, customerId=None, customerNamePrefix=None, maxResults=None, pageToken=None, x__xgafv=None)</a></code></p>
-<p class="firstline">List of subscriptions managed by the reseller. The list can be all subscriptions, all of a customer's subscriptions, or all of a customer's transferable subscriptions. Optionally, this method can filter the response by a `customerNamePrefix`. For more information, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions).</p>
+<p class="firstline">Lists of subscriptions managed by the reseller. The list can be all subscriptions, all of a customer's subscriptions, or all of a customer's transferable subscriptions. Optionally, this method can filter the response by a `customerNamePrefix`. For more information, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions).</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>
@@ -161,7 +161,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
@@ -174,7 +174,7 @@
 
 <div class="method">
     <code class="details" id="changePlan">changePlan(customerId, subscriptionId, body=None, x__xgafv=None)</code>
-  <pre>Update a subscription plan. Use this method to update a plan for a 30-day trial or a flexible plan subscription to an annual commitment plan with monthly or yearly payments. How a plan is updated differs depending on the plan and the products. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_plan).
+  <pre>Updates a subscription plan. Use this method to update a plan for a 30-day trial or a flexible plan subscription to an annual commitment plan with monthly or yearly payments. How a plan is updated differs depending on the plan and the products. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_plan).
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -238,7 +238,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
@@ -251,7 +251,7 @@
 
 <div class="method">
     <code class="details" id="changeRenewalSettings">changeRenewalSettings(customerId, subscriptionId, body=None, x__xgafv=None)</code>
-  <pre>Update a user license&#x27;s renewal settings. This is applicable for accounts with annual commitment plans only. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_renewal).
+  <pre>Updates a user license&#x27;s renewal settings. This is applicable for accounts with annual commitment plans only. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_renewal).
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -307,7 +307,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
@@ -320,7 +320,7 @@
 
 <div class="method">
     <code class="details" id="changeSeats">changeSeats(customerId, subscriptionId, body=None, x__xgafv=None)</code>
-  <pre>Update a subscription&#x27;s user license settings. For more information about updating an annual commitment plan or a flexible plan subscription’s licenses, see [Manage Subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_seat).
+  <pre>Updates a subscription&#x27;s user license settings. For more information about updating an annual commitment plan or a flexible plan subscription’s licenses, see [Manage Subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_seat).
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -378,7 +378,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
@@ -396,7 +396,7 @@
 
 <div class="method">
     <code class="details" id="delete">delete(customerId, subscriptionId, deletionType, x__xgafv=None)</code>
-  <pre>Cancel, suspend, or transfer a subscription to direct.
+  <pre>Cancels, suspends, or transfers a subscription to direct.
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -415,7 +415,7 @@
 
 <div class="method">
     <code class="details" id="get">get(customerId, subscriptionId, x__xgafv=None)</code>
-  <pre>Get a specific subscription. The `subscriptionId` can be found using the [Retrieve all reseller subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_all_subscriptions) method. For more information about retrieving a specific subscription, see the information descrived in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_subscription).
+  <pre>Gets a specific subscription. The `subscriptionId` can be found using the [Retrieve all reseller subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_all_subscriptions) method. For more information about retrieving a specific subscription, see the information descrived in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_subscription).
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -463,7 +463,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
@@ -476,7 +476,7 @@
 
 <div class="method">
     <code class="details" id="insert">insert(customerId, body=None, customerAuthToken=None, x__xgafv=None)</code>
-  <pre>Create or transfer a subscription. Create a subscription for a customer&#x27;s account that you ordered using the [Order a new customer account](/admin-sdk/reseller/v1/reference/customers/insert.html) method. For more information about creating a subscription for different payment plans, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#create_subscription).\ If you did not order the customer&#x27;s account using the customer insert method, use the customer&#x27;s `customerAuthToken` when creating a subscription for that customer. If transferring a G Suite subscription with an associated Google Drive or Google Vault subscription, use the [batch operation](/admin-sdk/reseller/v1/how-tos/batch.html) to transfer all of these subscriptions. For more information, see how to [transfer subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#transfer_a_subscription).
+  <pre>Creates or transfer a subscription. Create a subscription for a customer&#x27;s account that you ordered using the [Order a new customer account](/admin-sdk/reseller/v1/reference/customers/insert.html) method. For more information about creating a subscription for different payment plans, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#create_subscription).\ If you did not order the customer&#x27;s account using the customer insert method, use the customer&#x27;s `customerAuthToken` when creating a subscription for that customer. If transferring a G Suite subscription with an associated Google Drive or Google Vault subscription, use the [batch operation](/admin-sdk/reseller/v1/how-tos/batch.html) to transfer all of these subscriptions. For more information, see how to [transfer subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#transfer_a_subscription).
 
 Args:
   customerId: string, Either the customer&#x27;s primary domain name or the customer&#x27;s unique identifier. If using the domain name, we do not recommend using a `customerId` as a key for persistent data. If the domain name for a `customerId` is changed, the Google system automatically updates. (required)
@@ -518,7 +518,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
@@ -572,7 +572,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
@@ -585,7 +585,7 @@
 
 <div class="method">
     <code class="details" id="list">list(customerAuthToken=None, customerId=None, customerNamePrefix=None, maxResults=None, pageToken=None, x__xgafv=None)</code>
-  <pre>List of subscriptions managed by the reseller. The list can be all subscriptions, all of a customer&#x27;s subscriptions, or all of a customer&#x27;s transferable subscriptions. Optionally, this method can filter the response by a `customerNamePrefix`. For more information, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions).
+  <pre>Lists of subscriptions managed by the reseller. The list can be all subscriptions, all of a customer&#x27;s subscriptions, or all of a customer&#x27;s transferable subscriptions. Optionally, this method can filter the response by a `customerNamePrefix`. For more information, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions).
 
 Args:
   customerAuthToken: string, The `customerAuthToken` query string is required when creating a resold account that transfers a direct customer&#x27;s subscription or transfers another reseller customer&#x27;s subscription to your reseller management. This is a hexadecimal authentication token needed to complete the subscription transfer. For more information, see the administrator help center.
@@ -640,7 +640,7 @@
         &quot;A String&quot;,
       ],
       &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-        &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+        &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
         &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
         &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
       },
@@ -717,7 +717,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
@@ -778,7 +778,7 @@
     &quot;A String&quot;,
   ],
   &quot;transferInfo&quot;: { # Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.
-    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.
+    &quot;currentLegacySkuId&quot;: &quot;A String&quot;, # The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.
     &quot;minimumTransferableSeats&quot;: 42, # When inserting a subscription, this is the minimum number of seats listed in the transfer order for this product. For example, if the customer has 20 users, the reseller cannot place a transfer order of 15 seats. The minimum is 20 seats.
     &quot;transferabilityExpirationTime&quot;: &quot;A String&quot;, # The time when transfer token or intent to transfer will expire. The time is in milliseconds using UNIX Epoch format.
   },
diff --git a/docs/dyn/retail_v2.projects.locations.catalogs.branches.products.html b/docs/dyn/retail_v2.projects.locations.catalogs.branches.products.html
index f6b2fa5..de0c0c8 100644
--- a/docs/dyn/retail_v2.projects.locations.catalogs.branches.products.html
+++ b/docs/dyn/retail_v2.projects.locations.catalogs.branches.products.html
@@ -75,6 +75,9 @@
 <h1><a href="retail_v2.html">Retail API</a> . <a href="retail_v2.projects.html">projects</a> . <a href="retail_v2.projects.locations.html">locations</a> . <a href="retail_v2.projects.locations.catalogs.html">catalogs</a> . <a href="retail_v2.projects.locations.catalogs.branches.html">branches</a> . <a href="retail_v2.projects.locations.catalogs.branches.products.html">products</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
+  <code><a href="#addFulfillmentPlaces">addFulfillmentPlaces(product, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
   <code><a href="#close">close()</a></code></p>
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
@@ -90,10 +93,69 @@
   <code><a href="#import_">import_(parent, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Bulk import of multiple Products. Request processing may be synchronous. No partial updating is supported. Non-existing items are created. Note that it is possible for a subset of the Products to be successfully updated.</p>
 <p class="toc_element">
+  <code><a href="#list">list(parent, filter=None, pageSize=None, pageToken=None, readMask=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Gets a list of Products.</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="#patch">patch(name, allowMissing=None, body=None, updateMask=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a Product.</p>
+<p class="toc_element">
+  <code><a href="#removeFulfillmentPlaces">removeFulfillmentPlaces(product, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#setInventory">setInventory(name, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
 <h3>Method Details</h3>
 <div class="method">
+    <code class="details" id="addFulfillmentPlaces">addFulfillmentPlaces(product, body=None, x__xgafv=None)</code>
+  <pre>Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  product: string, Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for AddFulfillmentPlaces method.
+  &quot;addTime&quot;: &quot;A String&quot;, # The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;placeIds&quot;: [ # Required. The IDs for this type, such as the store IDs for &quot;pickup-in-store&quot; or the region IDs for &quot;same-day-delivery&quot; to be added for this type. Duplicate IDs will be automatically ignored. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned. If the total number of place IDs exceeds 2000 for this type after adding, then the update will be rejected.
+    &quot;A String&quot;,
+  ],
+  &quot;type&quot;: &quot;A String&quot;, # Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
     <code class="details" id="close">close()</code>
   <pre>Close httplib2 connections.</pre>
 </div>
@@ -108,23 +170,60 @@
     The object takes the form of:
 
 { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -133,20 +232,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2Product
+  ],
 }
 
   productId: string, Required. The ID to use for the Product, which will become the final component of the Product.name. If the caller does not have permission to create the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. This field must be unique among all Products with the same parent. Otherwise, an ALREADY_EXISTS error is returned. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
@@ -159,23 +302,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -184,20 +364,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2Product
+  ],
 }</pre>
 </div>
 
@@ -234,23 +458,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -259,20 +520,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2Product
+  ],
 }</pre>
 </div>
 
@@ -291,14 +596,19 @@
   },
   &quot;inputConfig&quot;: { # The input config source for products. # Required. The desired input location of the data.
     &quot;bigQuerySource&quot;: { # BigQuery source import data from. # BigQuery input source.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
       &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
       &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
       &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
     },
     &quot;gcsSource&quot;: { # Google Cloud Storage location for input content. format. # Google Cloud Storage location for the input content.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;inputUris&quot;: [ # Required. Google Cloud Storage URIs to input files. URI can be up to 2000 characters long. URIs can match the full object path (for example, `gs://bucket/directory/object.json`) or a pattern matching one or more files, such as `gs://bucket/directory/*.json`. A request can contain at most 100 files, and each file can be up to 2 GB. See [Importing product information](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog) for the expected file format and setup instructions.
         &quot;A String&quot;,
       ],
@@ -306,23 +616,60 @@
     &quot;productInlineSource&quot;: { # The inline source for the input config for ImportProducts method. # The Inline source for the input content for products.
       &quot;products&quot;: [ # Required. A list of products to update/create. Each product must have a valid Product.id. Recommended max of 100 items.
         { # Product captures all metadata information of items to be recommended or searched.
-          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
+          &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+            &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+              &quot;A String&quot;,
+            ],
+            &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+              &quot;A String&quot;,
+            ],
+          },
           &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
           &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+          &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+            &quot;A String&quot;,
+          ],
           &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
             &quot;A String&quot;,
           ],
+          &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+            &quot;A String&quot;,
+          ],
+          &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+            &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+          },
+          &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+            &quot;A String&quot;,
+          ],
           &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+          &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+          &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+            { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+              &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;A String&quot;,
+              ],
+              &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+            },
+          ],
+          &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
           &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
           &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
             { # Product thumbnail/detail image.
@@ -331,24 +678,71 @@
               &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
             },
           ],
+          &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+          &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+            &quot;A String&quot;,
+          ],
           &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+          &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+            &quot;A String&quot;,
+          ],
           &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
             &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
             &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
             &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+            &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+              &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+              &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+            },
           },
           &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+          &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+            { # Promotion information.
+              &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+            },
+          ],
+          &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+          &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+            &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+              42,
+            ],
+          },
+          &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+            &quot;A String&quot;,
+          ],
           &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
             &quot;A String&quot;,
           ],
           &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+          &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
           &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
           &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+          &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            # Object with schema name: GoogleCloudRetailV2Product
+          ],
         },
       ],
     },
   },
+  &quot;notificationPubsubTopic&quot;: &quot;A String&quot;, # Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+  &quot;reconciliationMode&quot;: &quot;A String&quot;, # The mode of reconciliation between existing products and the products to be imported. Defaults to ReconciliationMode.INCREMENTAL.
+  &quot;requestId&quot;: &quot;A String&quot;, # Unique identifier provided by client, within the ancestor dataset scope. Ensures idempotency and used for request deduplication. Server-generated if unspecified. Up to 128 characters long and must match the pattern: &quot;[a-zA-Z0-9_]+&quot;. This is returned as Operation.name in ImportMetadata. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
   &quot;updateMask&quot;: &quot;A String&quot;, # Indicates which fields in the provided imported &#x27;products&#x27; to update. If not set, will by default update all fields.
 }
 
@@ -382,6 +776,167 @@
 </div>
 
 <div class="method">
+    <code class="details" id="list">list(parent, filter=None, pageSize=None, pageToken=None, readMask=None, x__xgafv=None)</code>
+  <pre>Gets a list of Products.
+
+Args:
+  parent: string, Required. The parent branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use `default_branch` as the branch ID, to list products under the default branch. If the caller does not have permission to list Products under this branch, regardless of whether or not this branch exists, a PERMISSION_DENIED error is returned. (required)
+  filter: string, A filter to apply on the list results. Supported features: * List all the products under the parent branch if filter is unset. * List Product.Type.VARIANT Products sharing the same Product.Type.PRIMARY Product. For example: `primary_product_id = &quot;some_product_id&quot;` * List Products bundled in a Product.Type.COLLECTION Product. For example: `collection_product_id = &quot;some_product_id&quot;` * List Products with a partibular type. For example: `type = &quot;PRIMARY&quot;` `type = &quot;VARIANT&quot;` `type = &quot;COLLECTION&quot;` If the field is unrecognizable, an INVALID_ARGUMENT error is returned. If the specified Product.Type.PRIMARY Product or Product.Type.COLLECTION Product does not exist, a NOT_FOUND error is returned.
+  pageSize: integer, Maximum number of Products to return. If unspecified, defaults to 100. The maximum allowed value is 1000. Values above 1000 will be coerced to 1000. If this field is negative, an INVALID_ARGUMENT error is returned.
+  pageToken: string, A page token ListProductsResponse.next_page_token, received from a previous ProductService.ListProducts call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to ProductService.ListProducts must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.
+  readMask: string, The fields of Product to return in the responses. If not set or empty, the following fields are returned: * Product.name * Product.id * Product.title * Product.uri * Product.images * Product.price_info * Product.brands If &quot;*&quot; is provided, all fields are returned. Product.name is always returned no matter what mask is set. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for ProductService.ListProducts method.
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # A token that can be sent as ListProductsRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.
+  &quot;products&quot;: [ # The Products.
+    { # Product captures all metadata information of items to be recommended or searched.
+      &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+        &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+          &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+          &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            3.14,
+          ],
+          &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+          &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+        },
+      },
+      &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+        &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+          &quot;A String&quot;,
+        ],
+        &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+      &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+      &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+      &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+        &quot;A String&quot;,
+      ],
+      &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+        &quot;A String&quot;,
+      ],
+      &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+        &quot;A String&quot;,
+      ],
+      &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;A String&quot;,
+        ],
+        &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+        &quot;A String&quot;,
+      ],
+      &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+      &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+      &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+        { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+          &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+          &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+        },
+      ],
+      &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+      &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+      &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+        { # Product thumbnail/detail image.
+          &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+          &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        },
+      ],
+      &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+      &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+        &quot;A String&quot;,
+      ],
+      &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+      &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+        &quot;A String&quot;,
+      ],
+      &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+        &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+        &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+        &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+        &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+        &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+        &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+        &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+          &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+        },
+      },
+      &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+      &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+        { # Promotion information.
+          &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+        },
+      ],
+      &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+      &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+        &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+          42,
+        ],
+      },
+      &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+        &quot;A String&quot;,
+      ],
+      &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+        &quot;A String&quot;,
+      ],
+      &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+      &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+      &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+      &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+      &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+        # Object with schema name: GoogleCloudRetailV2Product
+      ],
+    },
+  ],
+}</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="patch">patch(name, allowMissing=None, body=None, updateMask=None, x__xgafv=None)</code>
   <pre>Updates a Product.
 
@@ -391,23 +946,60 @@
     The object takes the form of:
 
 { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -416,20 +1008,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2Product
+  ],
 }
 
   allowMissing: boolean, If set to true, and the Product is not found, a new Product will be created. In this situation, `update_mask` is ignored.
@@ -443,23 +1079,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -468,20 +1141,277 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2Product
+  ],
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="removeFulfillmentPlaces">removeFulfillmentPlaces(product, body=None, x__xgafv=None)</code>
+  <pre>Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  product: string, Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for RemoveFulfillmentPlaces method.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;placeIds&quot;: [ # Required. The IDs for this type, such as the store IDs for &quot;pickup-in-store&quot; or the region IDs for &quot;same-day-delivery&quot;, to be removed for this type. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;A String&quot;,
+  ],
+  &quot;removeTime&quot;: &quot;A String&quot;, # The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.
+  &quot;type&quot;: &quot;A String&quot;, # Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="setInventory">setInventory(name, body=None, x__xgafv=None)</code>
+  <pre>Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  name: string, Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for SetInventory method.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product with name Product.name is not found, the inventory update will still be processed and retained for at most 1 day until the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;inventory&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. The inventory information to update. The allowable fields to update are: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info The updated inventory fields must be specified in SetInventoryRequest.set_mask. If SetInventoryRequest.inventory.name is empty or invalid, an INVALID_ARGUMENT error is returned. If the caller does not have permission to update the Product named in Product.name, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. If the Product to update does not have existing inventory information, the provided inventory information will be inserted. If the Product to update has existing inventory information, the provided inventory information will be merged while respecting the last update time for each inventory field, using the provided or default value for SetInventoryRequest.set_time. The last update time is recorded for the following inventory fields: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info If a full overwrite of inventory information while ignoring timestamps is needed, UpdateProduct should be invoked instead.
+    &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+      &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+        &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+        &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+          3.14,
+        ],
+        &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+        &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;A String&quot;,
+        ],
+      },
+    },
+    &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+      &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+        &quot;A String&quot;,
+      ],
+      &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+    &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+    &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+    &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+      &quot;A String&quot;,
+    ],
+    &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+      &quot;A String&quot;,
+    ],
+    &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+      &quot;A String&quot;,
+    ],
+    &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;A String&quot;,
+      ],
+      &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+      &quot;A String&quot;,
+    ],
+    &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+    &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+    &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+      { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+        &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;A String&quot;,
+        ],
+        &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+      },
+    ],
+    &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+    &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+    &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+      { # Product thumbnail/detail image.
+        &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+        &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+      },
+    ],
+    &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+    &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+      &quot;A String&quot;,
+    ],
+    &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+    &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+      &quot;A String&quot;,
+    ],
+    &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+      &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+      &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+      &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+      &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+      &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+      &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+      &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+        &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+          &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+          &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+          &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+          &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+        },
+        &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+          &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+          &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+          &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+          &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+        },
+      },
+    },
+    &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+    &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+      { # Promotion information.
+        &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+      },
+    ],
+    &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+    &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+      &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+        42,
+      ],
+    },
+    &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+      &quot;A String&quot;,
+    ],
+    &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+      &quot;A String&quot;,
+    ],
+    &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+    &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+    &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+    &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+    &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      # Object with schema name: GoogleCloudRetailV2Product
+    ],
+  },
+  &quot;setMask&quot;: &quot;A String&quot;, # Indicates which inventory fields in the provided Product to update. If not set or set with empty paths, all inventory fields will be updated. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned and the entire update will be ignored.
+  &quot;setTime&quot;: &quot;A String&quot;, # The time when the request is issued, used to prevent out-of-order updates on inventory fields with the last update time recorded. If not provided, the internal system time will be used.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
 }</pre>
 </div>
 
diff --git a/docs/dyn/retail_v2.projects.locations.catalogs.completionData.html b/docs/dyn/retail_v2.projects.locations.catalogs.completionData.html
new file mode 100644
index 0000000..d550097
--- /dev/null
+++ b/docs/dyn/retail_v2.projects.locations.catalogs.completionData.html
@@ -0,0 +1,145 @@
+<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="retail_v2.html">Retail API</a> . <a href="retail_v2.projects.html">projects</a> . <a href="retail_v2.projects.locations.html">locations</a> . <a href="retail_v2.projects.locations.catalogs.html">catalogs</a> . <a href="retail_v2.projects.locations.catalogs.completionData.html">completionData</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="#import_">import_(parent, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</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="import_">import_(parent, body=None, x__xgafv=None)</code>
+  <pre>Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  parent: string, Required. The catalog which the suggestions dataset belongs to. Format: `projects/1234/locations/global/catalogs/default_catalog`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for ImportCompletionData methods.
+  &quot;inputConfig&quot;: { # The input config source for completion data. # Required. The desired input location of the data.
+    &quot;bigQuerySource&quot;: { # BigQuery source import data from. # Required. BigQuery input source. Add the IAM permission “BigQuery Data Viewer” for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
+      &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
+      &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
+      &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
+      &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
+    },
+  },
+  &quot;notificationPubsubTopic&quot;: &quot;A String&quot;, # Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2.projects.locations.catalogs.html b/docs/dyn/retail_v2.projects.locations.catalogs.html
index a917257..5b7a9fe 100644
--- a/docs/dyn/retail_v2.projects.locations.catalogs.html
+++ b/docs/dyn/retail_v2.projects.locations.catalogs.html
@@ -80,6 +80,11 @@
 <p class="firstline">Returns the branches Resource.</p>
 
 <p class="toc_element">
+  <code><a href="retail_v2.projects.locations.catalogs.completionData.html">completionData()</a></code>
+</p>
+<p class="firstline">Returns the completionData Resource.</p>
+
+<p class="toc_element">
   <code><a href="retail_v2.projects.locations.catalogs.operations.html">operations()</a></code>
 </p>
 <p class="firstline">Returns the operations Resource.</p>
@@ -98,6 +103,12 @@
   <code><a href="#close">close()</a></code></p>
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
+  <code><a href="#completeQuery">completeQuery(catalog, dataset=None, deviceType=None, languageCodes=None, maxSuggestions=None, query=None, visitorId=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#getDefaultBranch">getDefaultBranch(catalog, x__xgafv=None)</a></code></p>
+<p class="firstline">Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
   <code><a href="#list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Lists all the Catalogs associated with the project.</p>
 <p class="toc_element">
@@ -106,6 +117,9 @@
 <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 Catalogs.</p>
+<p class="toc_element">
+  <code><a href="#setDefaultBranch">setDefaultBranch(catalog, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using "default_branch" to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -113,6 +127,74 @@
 </div>
 
 <div class="method">
+    <code class="details" id="completeQuery">completeQuery(catalog, dataset=None, deviceType=None, languageCodes=None, maxSuggestions=None, query=None, visitorId=None, x__xgafv=None)</code>
+  <pre>Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, Required. Catalog for which the completion is performed. Full resource name of catalog, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  dataset: string, Determines which dataset to use for fetching completion. &quot;user-data&quot; will use the imported dataset through ImportCompletionData. &quot;cloud-retail&quot; will use the dataset generated by cloud retail based on user events. If leave empty, it will use the &quot;user-data&quot;. Current supported values: * user-data * cloud-retail This option is not automatically enabled. Before using cloud-retail, contact retail-search-support@google.com first.
+  deviceType: string, The device type context for completion suggestions. It is useful to apply different suggestions on different device types, e.g. DESKTOP, MOBILE. If it is empty, the suggestions are across all device types. Supported formats: * UNKNOWN_DEVICE_TYPE * DESKTOP * MOBILE * A customized string starts with OTHER_, e.g. OTHER_IPHONE.
+  languageCodes: string, The list of languages of the query. This is the BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more information, see [Tags for Identifying Languages](https://tools.ietf.org/html/bcp47). The maximum number of allowed characters is 255. Only &quot;en-US&quot; is currently supported. (repeated)
+  maxSuggestions: integer, Completion max suggestions. The maximum allowed max suggestions is 20. The default value is 20.
+  query: string, Required. The query used to generate suggestions. The maximum number of allowed characters is 255.
+  visitorId: string, A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response of the auto-complete query.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # A unique complete token. This should be included in the SearchRequest resulting from this completion, which enables accurate attribution of complete model performance.
+  &quot;completionResults&quot;: [ # Results of the matching suggestions. The result list is ordered and the first result is top suggestion.
+    { # Resource that represents completion results.
+      &quot;attributes&quot;: { # Additional custom attributes ingested through BigQuery.
+        &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+          &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+          &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            3.14,
+          ],
+          &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+          &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+        },
+      },
+      &quot;suggestion&quot;: &quot;A String&quot;, # The suggestion for the query.
+    },
+  ],
+  &quot;recentSearchResults&quot;: [ # Matched recent searches of this user. This field is a restricted feature. Contact Retail Support (retail-search-support@google.com) if you are interested in enabling it. This feature is only available when CompleteQueryRequest.visitor_id field is set and UserEvent is imported. The recent searches satisfy the follow rules: * They are ordered from latest to oldest. * They are matched with CompleteQueryRequest.query case insensitively. * They are transformed to lower cases. * They are UTF-8 safe. Recent searches are deduplicated. More recent searches will be reserved when duplication happens.
+    { # Recent search of this user.
+      &quot;recentSearch&quot;: &quot;A String&quot;, # The recent search query.
+    },
+  ],
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="getDefaultBranch">getDefaultBranch(catalog, x__xgafv=None)</code>
+  <pre>Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, The parent catalog resource name, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message of CatalogService.GetDefaultBranch.
+  &quot;branch&quot;: &quot;A String&quot;, # Full resource name of the branch id currently set as default branch.
+  &quot;note&quot;: &quot;A String&quot;, # This corresponds to SetDefaultBranchRequest.note field, when this branch was set as default.
+  &quot;setTime&quot;: &quot;A String&quot;, # The time when this branch is set to default.
+}</pre>
+</div>
+
+<div class="method">
     <code class="details" id="list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</code>
   <pre>Lists all the Catalogs associated with the project.
 
@@ -194,4 +276,30 @@
 }</pre>
 </div>
 
+<div class="method">
+    <code class="details" id="setDefaultBranch">setDefaultBranch(catalog, body=None, x__xgafv=None)</code>
+  <pre>Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using &quot;default_branch&quot; to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, Full resource name of the catalog, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message to set a specified branch as new default_branch.
+  &quot;branchId&quot;: &quot;A String&quot;, # The final component of the resource name of a branch. This field must be one of &quot;0&quot;, &quot;1&quot; or &quot;2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;note&quot;: &quot;A String&quot;, # Some note on this request, this can be retrieved by CatalogService.GetDefaultBranch before next valid default branch set occurs. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+}
+
+  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>
+
 </body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2.projects.locations.catalogs.placements.html b/docs/dyn/retail_v2.projects.locations.catalogs.placements.html
index c5cf29e..d9258cd 100644
--- a/docs/dyn/retail_v2.projects.locations.catalogs.placements.html
+++ b/docs/dyn/retail_v2.projects.locations.catalogs.placements.html
@@ -80,6 +80,12 @@
 <p class="toc_element">
   <code><a href="#predict">predict(placement, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Makes a recommendation prediction.</p>
+<p class="toc_element">
+  <code><a href="#search">search(placement, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#search_next">search_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -108,21 +114,31 @@
   &quot;userEvent&quot;: { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website. # Required. Context about the user, what they are looking at and what action they took to trigger the predict request. Note that this user event detail won&#x27;t be ingested to userEvent logs. Thus, a separate userEvent write request is required for event logging.
     &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
       &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+        &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
         &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
           3.14,
         ],
+        &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
         &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
           &quot;A String&quot;,
         ],
       },
     },
-    &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+    &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
     &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+    &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+      &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+      &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+      &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+    },
     &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
     &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
     &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
       &quot;A String&quot;,
     ],
+    &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
       &quot;A String&quot;,
     ],
@@ -130,23 +146,60 @@
     &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
       { # Detailed product information associated with a user event.
         &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
+          &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+            &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+              &quot;A String&quot;,
+            ],
+            &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+              &quot;A String&quot;,
+            ],
+          },
           &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
           &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+          &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+            &quot;A String&quot;,
+          ],
           &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
             &quot;A String&quot;,
           ],
+          &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+            &quot;A String&quot;,
+          ],
+          &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+            &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+          },
+          &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+            &quot;A String&quot;,
+          ],
           &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+          &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+          &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+            { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+              &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;A String&quot;,
+              ],
+              &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+            },
+          ],
+          &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
           &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
           &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
             { # Product thumbnail/detail image.
@@ -155,20 +208,64 @@
               &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
             },
           ],
+          &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+          &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+            &quot;A String&quot;,
+          ],
           &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+          &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+            &quot;A String&quot;,
+          ],
           &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
             &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
             &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
             &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+            &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+              &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+              &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+            },
           },
           &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+          &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+            { # Promotion information.
+              &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+            },
+          ],
+          &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+          &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+            &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+              42,
+            ],
+          },
+          &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+            &quot;A String&quot;,
+          ],
           &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
             &quot;A String&quot;,
           ],
           &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+          &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
           &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
           &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+          &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            # Object with schema name: GoogleCloudRetailV2Product
+          ],
         },
         &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
       },
@@ -181,12 +278,13 @@
       &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
     },
     &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-    &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
     &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
     &quot;userInfo&quot;: { # Information of an end user. # User information.
       &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-      &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-      &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+      &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+      &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
       &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
     },
     &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -219,4 +317,268 @@
 }</pre>
 </div>
 
+<div class="method">
+    <code class="details" id="search">search(placement, body=None, x__xgafv=None)</code>
+  <pre>Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  placement: string, Required. The resource name of the search engine placement, such as `projects/*/locations/global/catalogs/default_catalog/placements/default_search`. This field is used to identify the set of models that will be used to make the search. We currently support one placement with the following ID: * `default_search`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for SearchService.Search method.
+  &quot;boostSpec&quot;: { # Boost specification to boost certain items. # Boost specification to boost certain products. See more details at this [user guide](/retail/private/docs/boosting).
+    &quot;conditionBoostSpecs&quot;: [ # Condition boost specifications. If a product matches multiple conditions in the specifictions, boost scores from these specifications are all applied and combined in a non-linear way. Maximum number of specifications is 10.
+      { # Boost applies to products which match a condition.
+        &quot;boost&quot;: 3.14, # Strength of the condition boost, which should be in [-1, 1]. Negative boost means demotion. Default is 0.0. Setting to 1.0 gives the item a big promotion. However, it does not necessarily mean that the boosted item will be the top result at all times, nor that other items will be excluded. Results could still be shown even when none of them matches the condition. And results that are significantly more relevant to the search query can still trump your heavily favored but irrelevant items. Setting to -1.0 gives the item a big demotion. However, results that are deeply relevant might still be shown. The item will have an upstream battle to get a fairly high ranking, but it is not blocked out completely. Setting to 0.0 means no boost applied. The boosting condition is ignored.
+        &quot;condition&quot;: &quot;A String&quot;, # An expression which specifies a boost condition. The syntax and supported fields are the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Examples: * To boost products with product ID &quot;product_1&quot; or &quot;product_2&quot;, and color &quot;Red&quot; or &quot;Blue&quot;: *(id: ANY(&quot;product_1&quot;, &quot;product_2&quot;)) * *AND * *(colorFamilies: ANY(&quot;Red&quot;, &quot;Blue&quot;)) *
+      },
+    ],
+  },
+  &quot;branch&quot;: &quot;A String&quot;, # The branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use &quot;default_branch&quot; as the branch ID or leave this field empty, to search products under the default branch.
+  &quot;canonicalFilter&quot;: &quot;A String&quot;, # The filter applied to every search request when quality improvement such as query expansion is needed. For example, if a query does not have enough results, an expanded query with SearchRequest.canonical_filter will be returned as a supplement of the original query. This field is strongly recommended to achieve high search quality. See SearchRequest.filter for more details about filter syntax.
+  &quot;dynamicFacetSpec&quot;: { # The specifications of dynamically generated facets. # The specification for dynamically generated facets. Notice that only textual facets can be dynamically generated. This feature requires additional allowlisting. Contact Retail Support (retail-search-support@google.com) if you are interested in using dynamic facet feature.
+    &quot;mode&quot;: &quot;A String&quot;, # Mode of the DynamicFacet feature. Defaults to Mode.DISABLED if it&#x27;s unset.
+  },
+  &quot;facetSpecs&quot;: [ # Facet specifications for faceted search. If empty, no facets are returned. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # A facet specification to perform faceted search.
+      &quot;enableDynamicPosition&quot;: True or False, # Enables dynamic position for this facet. If set to true, the position of this facet among all facets in the response is determined by Google Retail Search. It will be ordered together with dynamic facets if dynamic facets is enabled. If set to false, the position of this facet in the response will be the same as in the request, and it will be ranked before the facets with dynamic position enable and all dynamic facets. For example, you may always want to have rating facet returned in the response, but it&#x27;s not necessarily to always display the rating facet at the top. In that case, you can set enable_dynamic_position to true so that the position of rating facet in response will be determined by Google Retail Search. Another example, assuming you have the following facets in the request: * &quot;rating&quot;, enable_dynamic_position = true * &quot;price&quot;, enable_dynamic_position = false * &quot;brands&quot;, enable_dynamic_position = false And also you have a dynamic facets enable, which will generate a facet &#x27;gender&#x27;. Then the final order of the facets in the response can be (&quot;price&quot;, &quot;brands&quot;, &quot;rating&quot;, &quot;gender&quot;) or (&quot;price&quot;, &quot;brands&quot;, &quot;gender&quot;, &quot;rating&quot;) depends on how Google Retail Search orders &quot;gender&quot; and &quot;rating&quot; facets. However, notice that &quot;price&quot; and &quot;brands&quot; will always be ranked at 1st and 2nd position since their enable_dynamic_position are false.
+      &quot;excludedFilterKeys&quot;: [ # List of keys to exclude when faceting. By default, FacetKey.key is not excluded from the filter unless it is listed in this field. For example, suppose there are 100 products with color facet &quot;Red&quot; and 200 products with color facet &quot;Blue&quot;. A query containing the filter &quot;colorFamilies:ANY(&quot;Red&quot;)&quot; and have &quot;colorFamilies&quot; as FacetKey.key will by default return the &quot;Red&quot; with count 100. If this field contains &quot;colorFamilies&quot;, then the query returns both the &quot;Red&quot; with count 100 and &quot;Blue&quot; with count 200, because the &quot;colorFamilies&quot; key is now excluded from the filter. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;facetKey&quot;: { # Specifies how a facet is computed. # Required. The facet key specification.
+        &quot;contains&quot;: [ # Only get facet values that contains the given strings. For example, suppose &quot;categories&quot; has three values &quot;Women &gt; Shoe&quot;, &quot;Women &gt; Dress&quot; and &quot;Men &gt; Shoe&quot;. If set &quot;contains&quot; to &quot;Shoe&quot;, the &quot;categories&quot; facet will give only &quot;Women &gt; Shoe&quot; and &quot;Men &gt; Shoe&quot;. Only supported on textual fields. Maximum is 10.
+          &quot;A String&quot;,
+        ],
+        &quot;intervals&quot;: [ # Set only if values should be bucketized into intervals. Must be set for facets with numerical values. Must not be set for facet with text values. Maximum number of intervals is 30.
+          { # A floating point interval.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+        ],
+        &quot;key&quot;: &quot;A String&quot;, # Required. Supported textual and numerical facet keys in Product object, over which the facet values are computed. Facet key is case-sensitive. Allowed facet keys when FacetKey.query is not specified: * textual_field = *# The Product.brands. * &quot;brands&quot;; *# The Product.categories. * &quot;categories&quot;; *# The Audience.genders. * | &quot;genders&quot;; *# The Audience.age_groups. * | &quot;ageGroups&quot;; *# The Product.availability. Value is one of * *# &quot;IN_STOCK&quot;, &quot;OUT_OF_STOCK&quot;, PREORDER&quot;, &quot;BACKORDER&quot;. * | &quot;availability&quot;; *# The ColorInfo.color_families. * | &quot;colorFamilies&quot;; *# The ColorInfo.colors. * | &quot;colors&quot;; *# The Product.sizes. * | &quot;sizes&quot;; *# The Product.materials. * | &quot;materials&quot;; *# The Product.patterns. * | &quot;patterns&quot;; *# The Product.conditions. * | &quot;conditions&quot;; *# The textual custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are textual. * *# map. * | &quot;attributes.key&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.PICKUP_IN_STORE. * | &quot;pickupInStore&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SHIP_TO_STORE. * | &quot;shipToStore&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SAME_DAY_DELIVERY. * | &quot;sameDayDelivery&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * | &quot;nextDayDelivery&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_1. * | &quot;customFulfillment1&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_2. * | &quot;customFulfillment2&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_3. * | &quot;customFulfillment3&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_4. * | &quot;customFulfillment4&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_5. * | &quot;customFulfillment5&quot;; * numerical_field = *# The PriceInfo.price. * &quot;price&quot;; *# The discount. Computed by (original_price-price)/price * &quot;discount&quot;; *# The Rating.average_rating. * &quot;rating&quot;; *# The Rating.rating_count. * &quot;ratingCount&quot;; *# The numerical custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are numerical. * | &quot;attributes.key&quot;;
+        &quot;orderBy&quot;: &quot;A String&quot;, # The order in which Facet.values are returned. Allowed values are: * &quot;count desc&quot;, which means order by Facet.FacetValue.count descending. * &quot;value desc&quot;, which means order by Facet.FacetValue.value descending. Only applies to textual facets. If not set, textual values are sorted in [natural order](https://en.wikipedia.org/wiki/Natural_sort_order); numerical intervals are sorted in the order given by FacetSpec.FacetKey.intervals; FulfillmentInfo.ids are sorted in the order given by FacetSpec.FacetKey.restricted_values.
+        &quot;prefixes&quot;: [ # Only get facet values that start with the given string prefix. For example, suppose &quot;categories&quot; has three values &quot;Women &gt; Shoe&quot;, &quot;Women &gt; Dress&quot; and &quot;Men &gt; Shoe&quot;. If set &quot;prefixes&quot; to &quot;Women&quot;, the &quot;categories&quot; facet will give only &quot;Women &gt; Shoe&quot; and &quot;Women &gt; Dress&quot;. Only supported on textual fields. Maximum is 10.
+          &quot;A String&quot;,
+        ],
+        &quot;query&quot;: &quot;A String&quot;, # The query that is used to compute facet for the given facet key. When provided, it will override the default behavior of facet computation. The query syntax is the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Notice that there is no limitation on FacetKey.key when query is specified. In the response, FacetValue.value will be always &quot;1&quot; and FacetValue.count will be the number of results that matches the query. For example, you can set a customized facet for &quot;shipToStore&quot;, where FacetKey.key is &quot;customizedShipToStore&quot;, and FacetKey.query is &quot;availability: ANY(\&quot;IN_STOCK\&quot;) AND shipToStore: ANY(\&quot;123\&quot;)&quot;. Then the facet will count the products that are both in stock and ship to store &quot;123&quot;.
+        &quot;restrictedValues&quot;: [ # Only get facet for the given restricted values. For example, when using &quot;pickupInStore&quot; as key and set restricted values to [&quot;store123&quot;, &quot;store456&quot;], only facets for &quot;store123&quot; and &quot;store456&quot; are returned. Only supported on textual fields and fulfillments. Maximum is 20. Must be set for the fulfillment facet keys: * pickupInStore * shipToStore * sameDayDelivery * nextDayDelivery * customFulfillment1 * customFulfillment2 * customFulfillment3 * customFulfillment4 * customFulfillment5
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;limit&quot;: 42, # Maximum of facet values that should be returned for this facet. If unspecified, defaults to 20. The maximum allowed value is 300. Values above 300 will be coerced to 300. If this field is negative, an INVALID_ARGUMENT is returned.
+    },
+  ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. Filter expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#filter). If this field is unrecognizable, an INVALID_ARGUMENT is returned.
+  &quot;offset&quot;: 42, # A 0-indexed integer that specifies the current offset (that is, starting result location, amongst the Products deemed by the API as relevant) in search results. This field is only considered if page_token is unset. If this field is negative, an INVALID_ARGUMENT is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. Products can be ordered by a field in an Product object. Leave it unset if ordered by relevance. OrderBy expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#order). If this field is unrecognizable, an INVALID_ARGUMENT is returned.
+  &quot;pageCategories&quot;: [ # The categories associated with a category page. Required for category navigation queries to achieve good search quality. The format should be the same as UserEvent.page_categories; To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;].
+    &quot;A String&quot;,
+  ],
+  &quot;pageSize&quot;: 42, # Maximum number of Products to return. If unspecified, defaults to a reasonable value. The maximum allowed value is 120. Values above 120 will be coerced to 120. If this field is negative, an INVALID_ARGUMENT is returned.
+  &quot;pageToken&quot;: &quot;A String&quot;, # A page token SearchResponse.next_page_token, received from a previous SearchService.Search call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to SearchService.Search must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;query&quot;: &quot;A String&quot;, # Raw search query.
+  &quot;queryExpansionSpec&quot;: { # Specification to determine under which conditions query expansion should occur. # The query expansion specification that specifies the conditions under which query expansion will occur. See more details at this [user guide](/retail/private/docs/result-size#query_expansion).
+    &quot;condition&quot;: &quot;A String&quot;, # The condition under which query expansion should occur. Default to Condition.DISABLED.
+  },
+  &quot;userInfo&quot;: { # Information of an end user. # User information.
+    &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  },
+  &quot;variantRollupKeys&quot;: [ # The keys to fetch and rollup the matching variant Products attributes. The attributes from all the matching variant Products are merged and de-duplicated. Notice that rollup variant Products attributes will lead to extra query latency. Maximum number of keys is 10. For Product.fulfillment_info, a fulfillment type and a fulfillment ID must be provided in the format of &quot;fulfillmentType.filfillmentId&quot;. E.g., in &quot;pickupInStore.store123&quot;, &quot;pickupInStore&quot; is fulfillment type and &quot;store123&quot; is the store ID. Supported keys are: * colorFamilies * price * originalPrice * discount * attributes.key, where key is any key in the Product.attributes map. * pickupInStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.PICKUP_IN_STORE. * shipToStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SHIP_TO_STORE. * sameDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SAME_DAY_DELIVERY. * nextDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * customFulfillment1.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_1. * customFulfillment2.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_2. * customFulfillment3.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_3. * customFulfillment4.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_4. * customFulfillment5.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_5. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    &quot;A String&quot;,
+  ],
+  &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for SearchService.Search method.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # A unique search token. This should be included in the UserEvent logs resulting from this search, which enables accurate attribution of search model performance.
+  &quot;correctedQuery&quot;: &quot;A String&quot;, # If spell correction applies, the corrected query. Otherwise, empty.
+  &quot;facets&quot;: [ # Results of facets requested by user.
+    { # A facet result.
+      &quot;dynamicFacet&quot;: True or False, # Whether the facet is dynamically generated.
+      &quot;key&quot;: &quot;A String&quot;, # The key for this facet. E.g., &quot;colorFamilies&quot; or &quot;price&quot; or &quot;attributes.attr1&quot;.
+      &quot;values&quot;: [ # The facet values for this field.
+        { # A facet value which contains value names and their count.
+          &quot;count&quot;: &quot;A String&quot;, # Number of items that have this facet value.
+          &quot;interval&quot;: { # A floating point interval. # Interval value for a facet, such as [10, 20) for facet &quot;price&quot;.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+          &quot;value&quot;: &quot;A String&quot;, # Text value of a facet, such as &quot;Black&quot; for facet &quot;colorFamilies&quot;.
+        },
+      ],
+    },
+  ],
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # A token that can be sent as SearchRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.
+  &quot;queryExpansionInfo&quot;: { # Information describing query expansion including whether expansion has occurred. # Query expansion information for the returned results.
+    &quot;expandedQuery&quot;: True or False, # Bool describing whether query expansion has occurred.
+  },
+  &quot;redirectUri&quot;: &quot;A String&quot;, # The URI of a customer-defined redirect page. If redirect action is triggered, no search will be performed, and only redirect_uri and attribution_token will be set in the response.
+  &quot;results&quot;: [ # A list of matched items. The order represents the ranking.
+    { # Represents the search results.
+      &quot;id&quot;: &quot;A String&quot;, # Product.id of the searched Product.
+      &quot;matchingVariantCount&quot;: 42, # The count of matched variant Products.
+      &quot;matchingVariantFields&quot;: { # If a variant Product matches the search query, this map indicates which Product fields are matched. The key is the Product.name, the value is a field mask of the matched Product fields. If matched attributes cannot be determined, this map will be empty. For example, a key &quot;sku1&quot; with field mask &quot;products.color_info&quot; indicates there is a match between &quot;sku1&quot; ColorInfo and the query.
+        &quot;a_key&quot;: &quot;A String&quot;,
+      },
+      &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # The product data snippet in the search response. Only Product.name is guaranteed to be populated. Product.variants contains the product variants that match the search query. If there are multiple product variants matching the query, top 5 most relevant product variants are returned and ordered by relevancy. If relevancy can be deternmined, use matching_variant_fields to look up matched product variants fields. If relevancy cannot be determined, e.g. when searching &quot;shoe&quot; all products in a shoe product can be a match, 5 product variants are returned but order is meaningless.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+          &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+            &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+              3.14,
+            ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+            &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+          },
+        },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+        &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
+        &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+          &quot;A String&quot;,
+        ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
+        &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+        &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+        &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+          { # Product thumbnail/detail image.
+            &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+            &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
+        &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
+        &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+          &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+          &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+          &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
+        },
+        &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
+        &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+          &quot;A String&quot;,
+        ],
+        &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+        &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+        &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2Product
+        ],
+      },
+      &quot;variantRollupValues&quot;: { # The rollup matching variant Product attributes. The key is one of the SearchRequest.variant_rollup_keys. The values are the merged and de-duplicated Product attributes. Notice that the rollup values are respect filter. For example, when filtering by &quot;colorFamilies:ANY(\&quot;red\&quot;)&quot; and rollup &quot;colorFamilies&quot;, only &quot;red&quot; is returned. For textual and numerical attributes, the rollup values is a list of string or double values with type google.protobuf.ListValue. For example, if there are two variants with colors &quot;red&quot; and &quot;blue&quot;, the rollup values are { key: &quot;colorFamilies&quot; value { list_value { values { string_value: &quot;red&quot; } values { string_value: &quot;blue&quot; } } } } For Product.fulfillment_info, the rollup values is a double value with type google.protobuf.Value. For example, {key: &quot;pickupInStore.store1&quot; value { number_value: 10 }} means a there are 10 variants in this product are available in the store &quot;store1&quot;.
+        &quot;a_key&quot;: &quot;&quot;,
+      },
+    },
+  ],
+  &quot;totalSize&quot;: 42, # The estimated total count of matched items irrespective of pagination. The count of results returned by pagination may be less than the total_size that matches.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="search_next">search_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>
+
 </body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2.projects.locations.catalogs.userEvents.html b/docs/dyn/retail_v2.projects.locations.catalogs.userEvents.html
index 7590a18..7322345 100644
--- a/docs/dyn/retail_v2.projects.locations.catalogs.userEvents.html
+++ b/docs/dyn/retail_v2.projects.locations.catalogs.userEvents.html
@@ -141,14 +141,19 @@
   },
   &quot;inputConfig&quot;: { # The input config source for user events. # Required. The desired input location of the data.
     &quot;bigQuerySource&quot;: { # BigQuery source import data from. # Required. BigQuery input source.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
       &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
       &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
       &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
     },
     &quot;gcsSource&quot;: { # Google Cloud Storage location for input content. format. # Required. Google Cloud Storage location for the input content.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;inputUris&quot;: [ # Required. Google Cloud Storage URIs to input files. URI can be up to 2000 characters long. URIs can match the full object path (for example, `gs://bucket/directory/object.json`) or a pattern matching one or more files, such as `gs://bucket/directory/*.json`. A request can contain at most 100 files, and each file can be up to 2 GB. See [Importing product information](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog) for the expected file format and setup instructions.
         &quot;A String&quot;,
       ],
@@ -158,21 +163,31 @@
         { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
           &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
-          &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+          &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
           &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+          &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+            &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+            &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+            &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+          },
           &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
           &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
           &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
             &quot;A String&quot;,
           ],
+          &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
           &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
             &quot;A String&quot;,
           ],
@@ -180,23 +195,60 @@
           &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
             { # Detailed product information associated with a user event.
               &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-                &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+                &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
                   &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+                    &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
                     &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                       3.14,
                     ],
+                    &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
                     &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                       &quot;A String&quot;,
                     ],
                   },
                 },
+                &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+                  &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+                    &quot;A String&quot;,
+                  ],
+                  &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+                    &quot;A String&quot;,
+                  ],
+                },
                 &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
                 &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-                &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+                &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+                &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+                  &quot;A String&quot;,
+                ],
                 &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
                   &quot;A String&quot;,
                 ],
+                &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+                  &quot;A String&quot;,
+                ],
+                &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                  &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                    &quot;A String&quot;,
+                  ],
+                  &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                    &quot;A String&quot;,
+                  ],
+                },
+                &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+                  &quot;A String&quot;,
+                ],
                 &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+                &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+                &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+                  { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+                    &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                      &quot;A String&quot;,
+                    ],
+                    &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+                  },
+                ],
+                &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
                 &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
                 &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
                   { # Product thumbnail/detail image.
@@ -205,20 +257,64 @@
                     &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
                   },
                 ],
+                &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+                &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+                  &quot;A String&quot;,
+                ],
                 &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+                &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+                  &quot;A String&quot;,
+                ],
                 &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
                   &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-                  &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+                  &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
                   &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
                   &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+                  &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+                  &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+                  &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+                    &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                      &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                      &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                      &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                      &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+                    },
+                    &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                      &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                      &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                      &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                      &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+                    },
+                  },
                 },
                 &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+                &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+                  { # Promotion information.
+                    &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+                  },
+                ],
+                &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+                &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+                  &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+                  &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+                  &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+                    42,
+                  ],
+                },
+                &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+                  &quot;A String&quot;,
+                ],
                 &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
                   &quot;A String&quot;,
                 ],
                 &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+                &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
                 &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
                 &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+                &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+                  # Object with schema name: GoogleCloudRetailV2Product
+                ],
               },
               &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
             },
@@ -231,12 +327,13 @@
             &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
           },
           &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-          &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
           &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
           &quot;userInfo&quot;: { # Information of an end user. # User information.
             &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-            &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-            &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+            &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+            &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
             &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
           },
           &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -372,21 +469,31 @@
 { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
   &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
-  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
   &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+  &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+    &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+    &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+    &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+  },
   &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
   &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
   &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
     &quot;A String&quot;,
   ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
   &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;A String&quot;,
   ],
@@ -394,23 +501,60 @@
   &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
     { # Detailed product information associated with a user event.
       &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
           &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
             &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               3.14,
             ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
             &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               &quot;A String&quot;,
             ],
           },
         },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
         &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
         &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
         &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
           &quot;A String&quot;,
         ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
         &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
         &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
         &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
           { # Product thumbnail/detail image.
@@ -419,20 +563,64 @@
             &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
           },
         ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
         &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
         &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
           &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
           &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
           &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
         },
         &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
         &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
           &quot;A String&quot;,
         ],
         &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
         &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
         &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2Product
+        ],
       },
       &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
     },
@@ -445,12 +633,13 @@
     &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
   },
   &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
   &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
   &quot;userInfo&quot;: { # Information of an end user. # User information.
     &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
     &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
   },
   &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -467,21 +656,31 @@
     { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
   &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
-  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
   &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+  &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+    &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+    &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+    &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+  },
   &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
   &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
   &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
     &quot;A String&quot;,
   ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
   &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;A String&quot;,
   ],
@@ -489,23 +688,60 @@
   &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
     { # Detailed product information associated with a user event.
       &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
           &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
             &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               3.14,
             ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
             &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               &quot;A String&quot;,
             ],
           },
         },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
         &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
         &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
         &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
           &quot;A String&quot;,
         ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
         &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
         &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
         &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
           { # Product thumbnail/detail image.
@@ -514,20 +750,64 @@
             &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
           },
         ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
         &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
         &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
           &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
           &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
           &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
         },
         &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
         &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
           &quot;A String&quot;,
         ],
         &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
         &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
         &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2Product
+        ],
       },
       &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
     },
@@ -540,12 +820,13 @@
     &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
   },
   &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
   &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
   &quot;userInfo&quot;: { # Information of an end user. # User information.
     &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
     &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
   },
   &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
diff --git a/docs/dyn/retail_v2alpha.projects.locations.catalogs.branches.products.html b/docs/dyn/retail_v2alpha.projects.locations.catalogs.branches.products.html
index 92a5f86..8729e1c 100644
--- a/docs/dyn/retail_v2alpha.projects.locations.catalogs.branches.products.html
+++ b/docs/dyn/retail_v2alpha.projects.locations.catalogs.branches.products.html
@@ -75,6 +75,9 @@
 <h1><a href="retail_v2alpha.html">Retail API</a> . <a href="retail_v2alpha.projects.html">projects</a> . <a href="retail_v2alpha.projects.locations.html">locations</a> . <a href="retail_v2alpha.projects.locations.catalogs.html">catalogs</a> . <a href="retail_v2alpha.projects.locations.catalogs.branches.html">branches</a> . <a href="retail_v2alpha.projects.locations.catalogs.branches.products.html">products</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
+  <code><a href="#addFulfillmentPlaces">addFulfillmentPlaces(product, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
   <code><a href="#close">close()</a></code></p>
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
@@ -90,10 +93,69 @@
   <code><a href="#import_">import_(parent, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Bulk import of multiple Products. Request processing may be synchronous. No partial updating is supported. Non-existing items are created. Note that it is possible for a subset of the Products to be successfully updated.</p>
 <p class="toc_element">
+  <code><a href="#list">list(parent, filter=None, pageSize=None, pageToken=None, readMask=None, requireTotalSize=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Gets a list of Products.</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="#patch">patch(name, allowMissing=None, body=None, updateMask=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a Product.</p>
+<p class="toc_element">
+  <code><a href="#removeFulfillmentPlaces">removeFulfillmentPlaces(product, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#setInventory">setInventory(name, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
 <h3>Method Details</h3>
 <div class="method">
+    <code class="details" id="addFulfillmentPlaces">addFulfillmentPlaces(product, body=None, x__xgafv=None)</code>
+  <pre>Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  product: string, Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for AddFulfillmentPlaces method.
+  &quot;addTime&quot;: &quot;A String&quot;, # The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;placeIds&quot;: [ # Required. The IDs for this type, such as the store IDs for &quot;pickup-in-store&quot; or the region IDs for &quot;same-day-delivery&quot; to be added for this type. Duplicate IDs will be automatically ignored. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned. If the total number of place IDs exceeds 2000 for this type after adding, then the update will be rejected.
+    &quot;A String&quot;,
+  ],
+  &quot;type&quot;: &quot;A String&quot;, # Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
     <code class="details" id="close">close()</code>
   <pre>Close httplib2 connections.</pre>
 </div>
@@ -108,23 +170,60 @@
     The object takes the form of:
 
 { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -133,20 +232,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2alphaProduct
+  ],
 }
 
   productId: string, Required. The ID to use for the Product, which will become the final component of the Product.name. If the caller does not have permission to create the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. This field must be unique among all Products with the same parent. Otherwise, an ALREADY_EXISTS error is returned. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
@@ -159,23 +302,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -184,20 +364,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2alphaProduct
+  ],
 }</pre>
 </div>
 
@@ -234,23 +458,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -259,20 +520,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2alphaProduct
+  ],
 }</pre>
 </div>
 
@@ -291,14 +596,19 @@
   },
   &quot;inputConfig&quot;: { # The input config source for products. # Required. The desired input location of the data.
     &quot;bigQuerySource&quot;: { # BigQuery source import data from. # BigQuery input source.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
       &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
       &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
       &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
     },
     &quot;gcsSource&quot;: { # Google Cloud Storage location for input content. format. # Google Cloud Storage location for the input content.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;inputUris&quot;: [ # Required. Google Cloud Storage URIs to input files. URI can be up to 2000 characters long. URIs can match the full object path (for example, `gs://bucket/directory/object.json`) or a pattern matching one or more files, such as `gs://bucket/directory/*.json`. A request can contain at most 100 files, and each file can be up to 2 GB. See [Importing product information](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog) for the expected file format and setup instructions.
         &quot;A String&quot;,
       ],
@@ -306,23 +616,60 @@
     &quot;productInlineSource&quot;: { # The inline source for the input config for ImportProducts method. # The Inline source for the input content for products.
       &quot;products&quot;: [ # Required. A list of products to update/create. Each product must have a valid Product.id. Recommended max of 100 items.
         { # Product captures all metadata information of items to be recommended or searched.
-          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
+          &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+            &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+              &quot;A String&quot;,
+            ],
+            &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+              &quot;A String&quot;,
+            ],
+          },
           &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
           &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+          &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+            &quot;A String&quot;,
+          ],
           &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
             &quot;A String&quot;,
           ],
+          &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+            &quot;A String&quot;,
+          ],
+          &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+            &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+          },
+          &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+            &quot;A String&quot;,
+          ],
           &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+          &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+          &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+            { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+              &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;A String&quot;,
+              ],
+              &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+            },
+          ],
+          &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
           &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
           &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
             { # Product thumbnail/detail image.
@@ -331,24 +678,71 @@
               &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
             },
           ],
+          &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+          &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+            &quot;A String&quot;,
+          ],
           &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+          &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+            &quot;A String&quot;,
+          ],
           &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
             &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
             &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
             &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+            &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+              &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+              &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+            },
           },
           &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+          &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+            { # Promotion information.
+              &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+            },
+          ],
+          &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+          &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+            &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+              42,
+            ],
+          },
+          &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+            &quot;A String&quot;,
+          ],
           &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
             &quot;A String&quot;,
           ],
           &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+          &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
           &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
           &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+          &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            # Object with schema name: GoogleCloudRetailV2alphaProduct
+          ],
         },
       ],
     },
   },
+  &quot;notificationPubsubTopic&quot;: &quot;A String&quot;, # Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+  &quot;reconciliationMode&quot;: &quot;A String&quot;, # The mode of reconciliation between existing products and the products to be imported. Defaults to ReconciliationMode.INCREMENTAL.
+  &quot;requestId&quot;: &quot;A String&quot;, # Unique identifier provided by client, within the ancestor dataset scope. Ensures idempotency and used for request deduplication. Server-generated if unspecified. Up to 128 characters long and must match the pattern: &quot;[a-zA-Z0-9_]+&quot;. This is returned as Operation.name in ImportMetadata. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
   &quot;updateMask&quot;: &quot;A String&quot;, # Indicates which fields in the provided imported &#x27;products&#x27; to update. If not set, will by default update all fields.
 }
 
@@ -382,6 +776,169 @@
 </div>
 
 <div class="method">
+    <code class="details" id="list">list(parent, filter=None, pageSize=None, pageToken=None, readMask=None, requireTotalSize=None, x__xgafv=None)</code>
+  <pre>Gets a list of Products.
+
+Args:
+  parent: string, Required. The parent branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use `default_branch` as the branch ID, to list products under the default branch. If the caller does not have permission to list Products under this branch, regardless of whether or not this branch exists, a PERMISSION_DENIED error is returned. (required)
+  filter: string, A filter to apply on the list results. Supported features: * List all the products under the parent branch if filter is unset. * List Product.Type.VARIANT Products sharing the same Product.Type.PRIMARY Product. For example: `primary_product_id = &quot;some_product_id&quot;` * List Products bundled in a Product.Type.COLLECTION Product. For example: `collection_product_id = &quot;some_product_id&quot;` * List Products with a partibular type. For example: `type = &quot;PRIMARY&quot;` `type = &quot;VARIANT&quot;` `type = &quot;COLLECTION&quot;` If the field is unrecognizable, an INVALID_ARGUMENT error is returned. If the specified Product.Type.PRIMARY Product or Product.Type.COLLECTION Product does not exist, a NOT_FOUND error is returned.
+  pageSize: integer, Maximum number of Products to return. If unspecified, defaults to 100. The maximum allowed value is 1000. Values above 1000 will be coerced to 1000. If this field is negative, an INVALID_ARGUMENT error is returned.
+  pageToken: string, A page token ListProductsResponse.next_page_token, received from a previous ProductService.ListProducts call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to ProductService.ListProducts must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.
+  readMask: string, The fields of Product to return in the responses. If not set or empty, the following fields are returned: * Product.name * Product.id * Product.title * Product.uri * Product.images * Product.price_info * Product.brands If &quot;*&quot; is provided, all fields are returned. Product.name is always returned no matter what mask is set. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned.
+  requireTotalSize: boolean, If true and page_token is empty, ListProductsResponse.total_size is set to the total count of matched items irrespective of pagination. Notice that setting this field to true affects the performance.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for ProductService.ListProducts method.
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # A token that can be sent as ListProductsRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.
+  &quot;products&quot;: [ # The Products.
+    { # Product captures all metadata information of items to be recommended or searched.
+      &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+        &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+          &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+          &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            3.14,
+          ],
+          &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+          &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+        },
+      },
+      &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+        &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+          &quot;A String&quot;,
+        ],
+        &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+      &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+      &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+      &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+        &quot;A String&quot;,
+      ],
+      &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+        &quot;A String&quot;,
+      ],
+      &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+        &quot;A String&quot;,
+      ],
+      &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;A String&quot;,
+        ],
+        &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+        &quot;A String&quot;,
+      ],
+      &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+      &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+      &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+        { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+          &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+          &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+        },
+      ],
+      &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+      &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+      &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+        { # Product thumbnail/detail image.
+          &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+          &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        },
+      ],
+      &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+      &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+        &quot;A String&quot;,
+      ],
+      &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+      &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+        &quot;A String&quot;,
+      ],
+      &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+        &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+        &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+        &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+        &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+        &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+        &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+        &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+          &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+        },
+      },
+      &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+      &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+        { # Promotion information.
+          &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+        },
+      ],
+      &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+      &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+        &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+          42,
+        ],
+      },
+      &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+        &quot;A String&quot;,
+      ],
+      &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+        &quot;A String&quot;,
+      ],
+      &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+      &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+      &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+      &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+      &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+        # Object with schema name: GoogleCloudRetailV2alphaProduct
+      ],
+    },
+  ],
+  &quot;totalSize&quot;: 42, # The total count of matched Products irrespective of pagination. The total number of Products returned by pagination may be less than the total_size that matches. This field is ignored if ListProductsRequest.require_total_size is not set or ListProductsRequest.page_token is not empty.
+}</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="patch">patch(name, allowMissing=None, body=None, updateMask=None, x__xgafv=None)</code>
   <pre>Updates a Product.
 
@@ -391,23 +948,60 @@
     The object takes the form of:
 
 { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -416,20 +1010,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2alphaProduct
+  ],
 }
 
   allowMissing: boolean, If set to true, and the Product is not found, a new Product will be created. In this situation, `update_mask` is ignored.
@@ -443,23 +1081,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -468,20 +1143,277 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2alphaProduct
+  ],
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="removeFulfillmentPlaces">removeFulfillmentPlaces(product, body=None, x__xgafv=None)</code>
+  <pre>Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  product: string, Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for RemoveFulfillmentPlaces method.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;placeIds&quot;: [ # Required. The IDs for this type, such as the store IDs for &quot;pickup-in-store&quot; or the region IDs for &quot;same-day-delivery&quot;, to be removed for this type. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;A String&quot;,
+  ],
+  &quot;removeTime&quot;: &quot;A String&quot;, # The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.
+  &quot;type&quot;: &quot;A String&quot;, # Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="setInventory">setInventory(name, body=None, x__xgafv=None)</code>
+  <pre>Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  name: string, Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for SetInventory method.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product with name Product.name is not found, the inventory update will still be processed and retained for at most 1 day until the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;inventory&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. The inventory information to update. The allowable fields to update are: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info The updated inventory fields must be specified in SetInventoryRequest.set_mask. If SetInventoryRequest.inventory.name is empty or invalid, an INVALID_ARGUMENT error is returned. If the caller does not have permission to update the Product named in Product.name, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. If the Product to update does not have existing inventory information, the provided inventory information will be inserted. If the Product to update has existing inventory information, the provided inventory information will be merged while respecting the last update time for each inventory field, using the provided or default value for SetInventoryRequest.set_time. The last update time is recorded for the following inventory fields: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info If a full overwrite of inventory information while ignoring timestamps is needed, UpdateProduct should be invoked instead.
+    &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+      &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+        &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+        &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+          3.14,
+        ],
+        &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+        &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;A String&quot;,
+        ],
+      },
+    },
+    &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+      &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+        &quot;A String&quot;,
+      ],
+      &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+    &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+    &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+    &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+      &quot;A String&quot;,
+    ],
+    &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+      &quot;A String&quot;,
+    ],
+    &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+      &quot;A String&quot;,
+    ],
+    &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;A String&quot;,
+      ],
+      &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+      &quot;A String&quot;,
+    ],
+    &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+    &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+    &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+      { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+        &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;A String&quot;,
+        ],
+        &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+      },
+    ],
+    &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+    &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+    &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+      { # Product thumbnail/detail image.
+        &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+        &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+      },
+    ],
+    &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+    &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+      &quot;A String&quot;,
+    ],
+    &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+    &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+      &quot;A String&quot;,
+    ],
+    &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+      &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+      &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+      &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+      &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+      &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+      &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+      &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+        &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+          &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+          &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+          &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+          &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+        },
+        &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+          &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+          &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+          &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+          &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+        },
+      },
+    },
+    &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+    &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+      { # Promotion information.
+        &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+      },
+    ],
+    &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+    &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+      &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+        42,
+      ],
+    },
+    &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+      &quot;A String&quot;,
+    ],
+    &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+      &quot;A String&quot;,
+    ],
+    &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+    &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+    &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+    &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+    &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      # Object with schema name: GoogleCloudRetailV2alphaProduct
+    ],
+  },
+  &quot;setMask&quot;: &quot;A String&quot;, # Indicates which inventory fields in the provided Product to update. If not set or set with empty paths, all inventory fields will be updated. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned and the entire update will be ignored.
+  &quot;setTime&quot;: &quot;A String&quot;, # The time when the request is issued, used to prevent out-of-order updates on inventory fields with the last update time recorded. If not provided, the internal system time will be used.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
 }</pre>
 </div>
 
diff --git a/docs/dyn/retail_v2alpha.projects.locations.catalogs.completionData.html b/docs/dyn/retail_v2alpha.projects.locations.catalogs.completionData.html
new file mode 100644
index 0000000..0ddac69
--- /dev/null
+++ b/docs/dyn/retail_v2alpha.projects.locations.catalogs.completionData.html
@@ -0,0 +1,145 @@
+<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="retail_v2alpha.html">Retail API</a> . <a href="retail_v2alpha.projects.html">projects</a> . <a href="retail_v2alpha.projects.locations.html">locations</a> . <a href="retail_v2alpha.projects.locations.catalogs.html">catalogs</a> . <a href="retail_v2alpha.projects.locations.catalogs.completionData.html">completionData</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="#import_">import_(parent, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</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="import_">import_(parent, body=None, x__xgafv=None)</code>
+  <pre>Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  parent: string, Required. The catalog which the suggestions dataset belongs to. Format: `projects/1234/locations/global/catalogs/default_catalog`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for ImportCompletionData methods.
+  &quot;inputConfig&quot;: { # The input config source for completion data. # Required. The desired input location of the data.
+    &quot;bigQuerySource&quot;: { # BigQuery source import data from. # Required. BigQuery input source. Add the IAM permission “BigQuery Data Viewer” for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
+      &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
+      &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
+      &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
+      &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
+    },
+  },
+  &quot;notificationPubsubTopic&quot;: &quot;A String&quot;, # Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2alpha.projects.locations.catalogs.html b/docs/dyn/retail_v2alpha.projects.locations.catalogs.html
index c16bf40..26245e3 100644
--- a/docs/dyn/retail_v2alpha.projects.locations.catalogs.html
+++ b/docs/dyn/retail_v2alpha.projects.locations.catalogs.html
@@ -80,6 +80,11 @@
 <p class="firstline">Returns the branches Resource.</p>
 
 <p class="toc_element">
+  <code><a href="retail_v2alpha.projects.locations.catalogs.completionData.html">completionData()</a></code>
+</p>
+<p class="firstline">Returns the completionData Resource.</p>
+
+<p class="toc_element">
   <code><a href="retail_v2alpha.projects.locations.catalogs.operations.html">operations()</a></code>
 </p>
 <p class="firstline">Returns the operations Resource.</p>
@@ -98,6 +103,12 @@
   <code><a href="#close">close()</a></code></p>
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
+  <code><a href="#completeQuery">completeQuery(catalog, dataset=None, deviceType=None, languageCodes=None, maxSuggestions=None, query=None, visitorId=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#getDefaultBranch">getDefaultBranch(catalog, x__xgafv=None)</a></code></p>
+<p class="firstline">Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
   <code><a href="#list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Lists all the Catalogs associated with the project.</p>
 <p class="toc_element">
@@ -106,6 +117,9 @@
 <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 Catalogs.</p>
+<p class="toc_element">
+  <code><a href="#setDefaultBranch">setDefaultBranch(catalog, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using "default_branch" to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -113,6 +127,74 @@
 </div>
 
 <div class="method">
+    <code class="details" id="completeQuery">completeQuery(catalog, dataset=None, deviceType=None, languageCodes=None, maxSuggestions=None, query=None, visitorId=None, x__xgafv=None)</code>
+  <pre>Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, Required. Catalog for which the completion is performed. Full resource name of catalog, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  dataset: string, Determines which dataset to use for fetching completion. &quot;user-data&quot; will use the imported dataset through ImportCompletionData. &quot;cloud-retail&quot; will use the dataset generated by cloud retail based on user events. If leave empty, it will use the &quot;user-data&quot;. Current supported values: * user-data * cloud-retail This option is not automatically enabled. Before using cloud-retail, contact retail-search-support@google.com first.
+  deviceType: string, The device type context for completion suggestions. It is useful to apply different suggestions on different device types, e.g. DESKTOP, MOBILE. If it is empty, the suggestions are across all device types. Supported formats: * UNKNOWN_DEVICE_TYPE * DESKTOP * MOBILE * A customized string starts with OTHER_, e.g. OTHER_IPHONE.
+  languageCodes: string, The list of languages of the query. This is the BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more information, see [Tags for Identifying Languages](https://tools.ietf.org/html/bcp47). The maximum number of allowed characters is 255. Only &quot;en-US&quot; is currently supported. (repeated)
+  maxSuggestions: integer, Completion max suggestions. The maximum allowed max suggestions is 20. The default value is 20.
+  query: string, Required. The query used to generate suggestions. The maximum number of allowed characters is 255.
+  visitorId: string, A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response of the auto-complete query.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # A unique complete token. This should be included in the SearchRequest resulting from this completion, which enables accurate attribution of complete model performance.
+  &quot;completionResults&quot;: [ # Results of the matching suggestions. The result list is ordered and the first result is top suggestion.
+    { # Resource that represents completion results.
+      &quot;attributes&quot;: { # Additional custom attributes ingested through BigQuery.
+        &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+          &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+          &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            3.14,
+          ],
+          &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+          &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+        },
+      },
+      &quot;suggestion&quot;: &quot;A String&quot;, # The suggestion for the query.
+    },
+  ],
+  &quot;recentSearchResults&quot;: [ # Matched recent searches of this user. This field is a restricted feature. Contact Retail Support (retail-search-support@google.com) if you are interested in enabling it. This feature is only available when CompleteQueryRequest.visitor_id field is set and UserEvent is imported. The recent searches satisfy the follow rules: * They are ordered from latest to oldest. * They are matched with CompleteQueryRequest.query case insensitively. * They are transformed to lower cases. * They are UTF-8 safe. Recent searches are deduplicated. More recent searches will be reserved when duplication happens.
+    { # Recent search of this user.
+      &quot;recentSearch&quot;: &quot;A String&quot;, # The recent search query.
+    },
+  ],
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="getDefaultBranch">getDefaultBranch(catalog, x__xgafv=None)</code>
+  <pre>Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, The parent catalog resource name, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message of CatalogService.GetDefaultBranch.
+  &quot;branch&quot;: &quot;A String&quot;, # Full resource name of the branch id currently set as default branch.
+  &quot;note&quot;: &quot;A String&quot;, # This corresponds to SetDefaultBranchRequest.note field, when this branch was set as default.
+  &quot;setTime&quot;: &quot;A String&quot;, # The time when this branch is set to default.
+}</pre>
+</div>
+
+<div class="method">
     <code class="details" id="list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</code>
   <pre>Lists all the Catalogs associated with the project.
 
@@ -132,6 +214,17 @@
   &quot;catalogs&quot;: [ # All the customer&#x27;s Catalogs.
     { # The catalog configuration.
       &quot;displayName&quot;: &quot;A String&quot;, # Required. Immutable. The catalog display name. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;merchantCenterLinkingConfig&quot;: { # Configures Merchant Center linking. Links contained in the config will be used to sync data from a Merchant Center account to a Cloud Retail branch. # The Merchant Center linking configuration. Once a link is added, the data stream from Merchant Center to Cloud Retail will be enabled automatically. The requester must have access to the merchant center account in order to make changes to this field.
+        &quot;links&quot;: [ # Links between Merchant Center accounts and branches.
+          { # Represents a link between a Merchant Center account and a branch. Once a link is established, products from the linked merchant center account will be streamed to the linked branch.
+            &quot;branchId&quot;: &quot;A String&quot;, # The branch id (e.g. 0/1/2) within this catalog that products from merchant_center_account_id are streamed to. When updating this field, an empty value will use the currently configured default branch. However, changing the default branch later on won&#x27;t change the linked branch here. A single branch id can only have one linked merchant center account id.
+            &quot;destinations&quot;: [ # String representing the destination to import for, all if left empty. List of possible values can be found here. [https://support.google.com/merchants/answer/7501026?hl=en] List of allowed string values: &quot;shopping-ads&quot;, &quot;buy-on-google-listings&quot;, &quot;display-ads&quot;, &quot;local-inventory -ads&quot;, &quot;free-listings&quot;, &quot;free-local-listings&quot; NOTE: The string values are case sensitive.
+              &quot;A String&quot;,
+            ],
+            &quot;merchantCenterAccountId&quot;: &quot;A String&quot;, # Required. The linked [Merchant center account id](https://developers.google.com/shopping-content/guides/accountstatuses). The account must be a standalone account or a sub-account of a MCA.
+          },
+        ],
+      },
       &quot;name&quot;: &quot;A String&quot;, # Required. Immutable. The fully qualified resource name of the catalog.
       &quot;productLevelConfig&quot;: { # Configures what level the product should be uploaded with regards to how users will be send events and how predictions will be made. # Required. The product level configuration.
         &quot;ingestionProductType&quot;: &quot;A String&quot;, # The type of Products allowed to be ingested into the catalog. Acceptable values are: * `primary` (default): You can only ingest Product.Type.PRIMARY Products. This means Product.primary_product_id can only be empty or set to the same value as Product.id. * `variant`: You can only ingest Product.Type.VARIANT Products. This means Product.primary_product_id cannot be empty. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. If this field is `variant` and merchant_center_product_id_field is `itemGroupId`, an INVALID_ARGUMENT error is returned. See [Using product levels](https://cloud.google.com/retail/recommendations-ai/docs/catalog#product-levels) for more details.
@@ -168,6 +261,17 @@
 
 { # The catalog configuration.
   &quot;displayName&quot;: &quot;A String&quot;, # Required. Immutable. The catalog display name. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;merchantCenterLinkingConfig&quot;: { # Configures Merchant Center linking. Links contained in the config will be used to sync data from a Merchant Center account to a Cloud Retail branch. # The Merchant Center linking configuration. Once a link is added, the data stream from Merchant Center to Cloud Retail will be enabled automatically. The requester must have access to the merchant center account in order to make changes to this field.
+    &quot;links&quot;: [ # Links between Merchant Center accounts and branches.
+      { # Represents a link between a Merchant Center account and a branch. Once a link is established, products from the linked merchant center account will be streamed to the linked branch.
+        &quot;branchId&quot;: &quot;A String&quot;, # The branch id (e.g. 0/1/2) within this catalog that products from merchant_center_account_id are streamed to. When updating this field, an empty value will use the currently configured default branch. However, changing the default branch later on won&#x27;t change the linked branch here. A single branch id can only have one linked merchant center account id.
+        &quot;destinations&quot;: [ # String representing the destination to import for, all if left empty. List of possible values can be found here. [https://support.google.com/merchants/answer/7501026?hl=en] List of allowed string values: &quot;shopping-ads&quot;, &quot;buy-on-google-listings&quot;, &quot;display-ads&quot;, &quot;local-inventory -ads&quot;, &quot;free-listings&quot;, &quot;free-local-listings&quot; NOTE: The string values are case sensitive.
+          &quot;A String&quot;,
+        ],
+        &quot;merchantCenterAccountId&quot;: &quot;A String&quot;, # Required. The linked [Merchant center account id](https://developers.google.com/shopping-content/guides/accountstatuses). The account must be a standalone account or a sub-account of a MCA.
+      },
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # Required. Immutable. The fully qualified resource name of the catalog.
   &quot;productLevelConfig&quot;: { # Configures what level the product should be uploaded with regards to how users will be send events and how predictions will be made. # Required. The product level configuration.
     &quot;ingestionProductType&quot;: &quot;A String&quot;, # The type of Products allowed to be ingested into the catalog. Acceptable values are: * `primary` (default): You can only ingest Product.Type.PRIMARY Products. This means Product.primary_product_id can only be empty or set to the same value as Product.id. * `variant`: You can only ingest Product.Type.VARIANT Products. This means Product.primary_product_id cannot be empty. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. If this field is `variant` and merchant_center_product_id_field is `itemGroupId`, an INVALID_ARGUMENT error is returned. See [Using product levels](https://cloud.google.com/retail/recommendations-ai/docs/catalog#product-levels) for more details.
@@ -186,6 +290,17 @@
 
     { # The catalog configuration.
   &quot;displayName&quot;: &quot;A String&quot;, # Required. Immutable. The catalog display name. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;merchantCenterLinkingConfig&quot;: { # Configures Merchant Center linking. Links contained in the config will be used to sync data from a Merchant Center account to a Cloud Retail branch. # The Merchant Center linking configuration. Once a link is added, the data stream from Merchant Center to Cloud Retail will be enabled automatically. The requester must have access to the merchant center account in order to make changes to this field.
+    &quot;links&quot;: [ # Links between Merchant Center accounts and branches.
+      { # Represents a link between a Merchant Center account and a branch. Once a link is established, products from the linked merchant center account will be streamed to the linked branch.
+        &quot;branchId&quot;: &quot;A String&quot;, # The branch id (e.g. 0/1/2) within this catalog that products from merchant_center_account_id are streamed to. When updating this field, an empty value will use the currently configured default branch. However, changing the default branch later on won&#x27;t change the linked branch here. A single branch id can only have one linked merchant center account id.
+        &quot;destinations&quot;: [ # String representing the destination to import for, all if left empty. List of possible values can be found here. [https://support.google.com/merchants/answer/7501026?hl=en] List of allowed string values: &quot;shopping-ads&quot;, &quot;buy-on-google-listings&quot;, &quot;display-ads&quot;, &quot;local-inventory -ads&quot;, &quot;free-listings&quot;, &quot;free-local-listings&quot; NOTE: The string values are case sensitive.
+          &quot;A String&quot;,
+        ],
+        &quot;merchantCenterAccountId&quot;: &quot;A String&quot;, # Required. The linked [Merchant center account id](https://developers.google.com/shopping-content/guides/accountstatuses). The account must be a standalone account or a sub-account of a MCA.
+      },
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # Required. Immutable. The fully qualified resource name of the catalog.
   &quot;productLevelConfig&quot;: { # Configures what level the product should be uploaded with regards to how users will be send events and how predictions will be made. # Required. The product level configuration.
     &quot;ingestionProductType&quot;: &quot;A String&quot;, # The type of Products allowed to be ingested into the catalog. Acceptable values are: * `primary` (default): You can only ingest Product.Type.PRIMARY Products. This means Product.primary_product_id can only be empty or set to the same value as Product.id. * `variant`: You can only ingest Product.Type.VARIANT Products. This means Product.primary_product_id cannot be empty. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. If this field is `variant` and merchant_center_product_id_field is `itemGroupId`, an INVALID_ARGUMENT error is returned. See [Using product levels](https://cloud.google.com/retail/recommendations-ai/docs/catalog#product-levels) for more details.
@@ -194,4 +309,30 @@
 }</pre>
 </div>
 
+<div class="method">
+    <code class="details" id="setDefaultBranch">setDefaultBranch(catalog, body=None, x__xgafv=None)</code>
+  <pre>Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using &quot;default_branch&quot; to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, Full resource name of the catalog, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message to set a specified branch as new default_branch.
+  &quot;branchId&quot;: &quot;A String&quot;, # The final component of the resource name of a branch. This field must be one of &quot;0&quot;, &quot;1&quot; or &quot;2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;note&quot;: &quot;A String&quot;, # Some note on this request, this can be retrieved by CatalogService.GetDefaultBranch before next valid default branch set occurs. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+}
+
+  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>
+
 </body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2alpha.projects.locations.catalogs.placements.html b/docs/dyn/retail_v2alpha.projects.locations.catalogs.placements.html
index 554c03f..2ad160d 100644
--- a/docs/dyn/retail_v2alpha.projects.locations.catalogs.placements.html
+++ b/docs/dyn/retail_v2alpha.projects.locations.catalogs.placements.html
@@ -80,6 +80,12 @@
 <p class="toc_element">
   <code><a href="#predict">predict(placement, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Makes a recommendation prediction.</p>
+<p class="toc_element">
+  <code><a href="#search">search(placement, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#search_next">search_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -108,21 +114,31 @@
   &quot;userEvent&quot;: { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website. # Required. Context about the user, what they are looking at and what action they took to trigger the predict request. Note that this user event detail won&#x27;t be ingested to userEvent logs. Thus, a separate userEvent write request is required for event logging.
     &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
       &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+        &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
         &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
           3.14,
         ],
+        &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
         &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
           &quot;A String&quot;,
         ],
       },
     },
-    &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+    &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
     &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+    &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+      &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+      &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+      &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+    },
     &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
     &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
     &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
       &quot;A String&quot;,
     ],
+    &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
       &quot;A String&quot;,
     ],
@@ -130,23 +146,60 @@
     &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
       { # Detailed product information associated with a user event.
         &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
+          &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+            &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+              &quot;A String&quot;,
+            ],
+            &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+              &quot;A String&quot;,
+            ],
+          },
           &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
           &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+          &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+            &quot;A String&quot;,
+          ],
           &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
             &quot;A String&quot;,
           ],
+          &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+            &quot;A String&quot;,
+          ],
+          &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+            &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+          },
+          &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+            &quot;A String&quot;,
+          ],
           &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+          &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+          &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+            { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+              &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;A String&quot;,
+              ],
+              &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+            },
+          ],
+          &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
           &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
           &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
             { # Product thumbnail/detail image.
@@ -155,20 +208,64 @@
               &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
             },
           ],
+          &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+          &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+            &quot;A String&quot;,
+          ],
           &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+          &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+            &quot;A String&quot;,
+          ],
           &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
             &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
             &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
             &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+            &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+              &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+              &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+            },
           },
           &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+          &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+            { # Promotion information.
+              &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+            },
+          ],
+          &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+          &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+            &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+              42,
+            ],
+          },
+          &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+            &quot;A String&quot;,
+          ],
           &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
             &quot;A String&quot;,
           ],
           &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+          &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
           &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
           &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+          &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            # Object with schema name: GoogleCloudRetailV2alphaProduct
+          ],
         },
         &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
       },
@@ -181,12 +278,13 @@
       &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
     },
     &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-    &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
     &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
     &quot;userInfo&quot;: { # Information of an end user. # User information.
       &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-      &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-      &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+      &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+      &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
       &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
     },
     &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -219,4 +317,269 @@
 }</pre>
 </div>
 
+<div class="method">
+    <code class="details" id="search">search(placement, body=None, x__xgafv=None)</code>
+  <pre>Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  placement: string, Required. The resource name of the search engine placement, such as `projects/*/locations/global/catalogs/default_catalog/placements/default_search`. This field is used to identify the set of models that will be used to make the search. We currently support one placement with the following ID: * `default_search`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for SearchService.Search method.
+  &quot;boostSpec&quot;: { # Boost specification to boost certain items. # Boost specification to boost certain products. See more details at this [user guide](/retail/private/docs/boosting).
+    &quot;conditionBoostSpecs&quot;: [ # Condition boost specifications. If a product matches multiple conditions in the specifictions, boost scores from these specifications are all applied and combined in a non-linear way. Maximum number of specifications is 10.
+      { # Boost applies to products which match a condition.
+        &quot;boost&quot;: 3.14, # Strength of the condition boost, which should be in [-1, 1]. Negative boost means demotion. Default is 0.0. Setting to 1.0 gives the item a big promotion. However, it does not necessarily mean that the boosted item will be the top result at all times, nor that other items will be excluded. Results could still be shown even when none of them matches the condition. And results that are significantly more relevant to the search query can still trump your heavily favored but irrelevant items. Setting to -1.0 gives the item a big demotion. However, results that are deeply relevant might still be shown. The item will have an upstream battle to get a fairly high ranking, but it is not blocked out completely. Setting to 0.0 means no boost applied. The boosting condition is ignored.
+        &quot;condition&quot;: &quot;A String&quot;, # An expression which specifies a boost condition. The syntax and supported fields are the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Examples: * To boost products with product ID &quot;product_1&quot; or &quot;product_2&quot;, and color &quot;Red&quot; or &quot;Blue&quot;: *(id: ANY(&quot;product_1&quot;, &quot;product_2&quot;)) * *AND * *(colorFamilies: ANY(&quot;Red&quot;, &quot;Blue&quot;)) *
+      },
+    ],
+  },
+  &quot;branch&quot;: &quot;A String&quot;, # The branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use &quot;default_branch&quot; as the branch ID or leave this field empty, to search products under the default branch.
+  &quot;canonicalFilter&quot;: &quot;A String&quot;, # The filter applied to every search request when quality improvement such as query expansion is needed. For example, if a query does not have enough results, an expanded query with SearchRequest.canonical_filter will be returned as a supplement of the original query. This field is strongly recommended to achieve high search quality. See SearchRequest.filter for more details about filter syntax.
+  &quot;dynamicFacetSpec&quot;: { # The specifications of dynamically generated facets. # The specification for dynamically generated facets. Notice that only textual facets can be dynamically generated. This feature requires additional allowlisting. Contact Retail Support (retail-search-support@google.com) if you are interested in using dynamic facet feature.
+    &quot;mode&quot;: &quot;A String&quot;, # Mode of the DynamicFacet feature. Defaults to Mode.DISABLED if it&#x27;s unset.
+  },
+  &quot;facetSpecs&quot;: [ # Facet specifications for faceted search. If empty, no facets are returned. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # A facet specification to perform faceted search.
+      &quot;enableDynamicPosition&quot;: True or False, # Enables dynamic position for this facet. If set to true, the position of this facet among all facets in the response is determined by Google Retail Search. It will be ordered together with dynamic facets if dynamic facets is enabled. If set to false, the position of this facet in the response will be the same as in the request, and it will be ranked before the facets with dynamic position enable and all dynamic facets. For example, you may always want to have rating facet returned in the response, but it&#x27;s not necessarily to always display the rating facet at the top. In that case, you can set enable_dynamic_position to true so that the position of rating facet in response will be determined by Google Retail Search. Another example, assuming you have the following facets in the request: * &quot;rating&quot;, enable_dynamic_position = true * &quot;price&quot;, enable_dynamic_position = false * &quot;brands&quot;, enable_dynamic_position = false And also you have a dynamic facets enable, which will generate a facet &#x27;gender&#x27;. Then the final order of the facets in the response can be (&quot;price&quot;, &quot;brands&quot;, &quot;rating&quot;, &quot;gender&quot;) or (&quot;price&quot;, &quot;brands&quot;, &quot;gender&quot;, &quot;rating&quot;) depends on how Google Retail Search orders &quot;gender&quot; and &quot;rating&quot; facets. However, notice that &quot;price&quot; and &quot;brands&quot; will always be ranked at 1st and 2nd position since their enable_dynamic_position are false.
+      &quot;excludedFilterKeys&quot;: [ # List of keys to exclude when faceting. By default, FacetKey.key is not excluded from the filter unless it is listed in this field. For example, suppose there are 100 products with color facet &quot;Red&quot; and 200 products with color facet &quot;Blue&quot;. A query containing the filter &quot;colorFamilies:ANY(&quot;Red&quot;)&quot; and have &quot;colorFamilies&quot; as FacetKey.key will by default return the &quot;Red&quot; with count 100. If this field contains &quot;colorFamilies&quot;, then the query returns both the &quot;Red&quot; with count 100 and &quot;Blue&quot; with count 200, because the &quot;colorFamilies&quot; key is now excluded from the filter. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;facetKey&quot;: { # Specifies how a facet is computed. # Required. The facet key specification.
+        &quot;contains&quot;: [ # Only get facet values that contains the given strings. For example, suppose &quot;categories&quot; has three values &quot;Women &gt; Shoe&quot;, &quot;Women &gt; Dress&quot; and &quot;Men &gt; Shoe&quot;. If set &quot;contains&quot; to &quot;Shoe&quot;, the &quot;categories&quot; facet will give only &quot;Women &gt; Shoe&quot; and &quot;Men &gt; Shoe&quot;. Only supported on textual fields. Maximum is 10.
+          &quot;A String&quot;,
+        ],
+        &quot;intervals&quot;: [ # Set only if values should be bucketized into intervals. Must be set for facets with numerical values. Must not be set for facet with text values. Maximum number of intervals is 30.
+          { # A floating point interval.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+        ],
+        &quot;key&quot;: &quot;A String&quot;, # Required. Supported textual and numerical facet keys in Product object, over which the facet values are computed. Facet key is case-sensitive. Allowed facet keys when FacetKey.query is not specified: * textual_field = *# The Product.brands. * &quot;brands&quot;; *# The Product.categories. * &quot;categories&quot;; *# The Audience.genders. * | &quot;genders&quot;; *# The Audience.age_groups. * | &quot;ageGroups&quot;; *# The Product.availability. Value is one of * *# &quot;IN_STOCK&quot;, &quot;OUT_OF_STOCK&quot;, PREORDER&quot;, &quot;BACKORDER&quot;. * | &quot;availability&quot;; *# The ColorInfo.color_families. * | &quot;colorFamilies&quot;; *# The ColorInfo.colors. * | &quot;colors&quot;; *# The Product.sizes. * | &quot;sizes&quot;; *# The Product.materials. * | &quot;materials&quot;; *# The Product.patterns. * | &quot;patterns&quot;; *# The Product.conditions. * | &quot;conditions&quot;; *# The textual custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are textual. * *# map. * | &quot;attributes.key&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.PICKUP_IN_STORE. * | &quot;pickupInStore&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SHIP_TO_STORE. * | &quot;shipToStore&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SAME_DAY_DELIVERY. * | &quot;sameDayDelivery&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * | &quot;nextDayDelivery&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_1. * | &quot;customFulfillment1&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_2. * | &quot;customFulfillment2&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_3. * | &quot;customFulfillment3&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_4. * | &quot;customFulfillment4&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_5. * | &quot;customFulfillment5&quot;; * numerical_field = *# The PriceInfo.price. * &quot;price&quot;; *# The discount. Computed by (original_price-price)/price * &quot;discount&quot;; *# The Rating.average_rating. * &quot;rating&quot;; *# The Rating.rating_count. * &quot;ratingCount&quot;; *# The numerical custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are numerical. * | &quot;attributes.key&quot;;
+        &quot;orderBy&quot;: &quot;A String&quot;, # The order in which Facet.values are returned. Allowed values are: * &quot;count desc&quot;, which means order by Facet.FacetValue.count descending. * &quot;value desc&quot;, which means order by Facet.FacetValue.value descending. Only applies to textual facets. If not set, textual values are sorted in [natural order](https://en.wikipedia.org/wiki/Natural_sort_order); numerical intervals are sorted in the order given by FacetSpec.FacetKey.intervals; FulfillmentInfo.ids are sorted in the order given by FacetSpec.FacetKey.restricted_values.
+        &quot;prefixes&quot;: [ # Only get facet values that start with the given string prefix. For example, suppose &quot;categories&quot; has three values &quot;Women &gt; Shoe&quot;, &quot;Women &gt; Dress&quot; and &quot;Men &gt; Shoe&quot;. If set &quot;prefixes&quot; to &quot;Women&quot;, the &quot;categories&quot; facet will give only &quot;Women &gt; Shoe&quot; and &quot;Women &gt; Dress&quot;. Only supported on textual fields. Maximum is 10.
+          &quot;A String&quot;,
+        ],
+        &quot;query&quot;: &quot;A String&quot;, # The query that is used to compute facet for the given facet key. When provided, it will override the default behavior of facet computation. The query syntax is the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Notice that there is no limitation on FacetKey.key when query is specified. In the response, FacetValue.value will be always &quot;1&quot; and FacetValue.count will be the number of results that matches the query. For example, you can set a customized facet for &quot;shipToStore&quot;, where FacetKey.key is &quot;customizedShipToStore&quot;, and FacetKey.query is &quot;availability: ANY(\&quot;IN_STOCK\&quot;) AND shipToStore: ANY(\&quot;123\&quot;)&quot;. Then the facet will count the products that are both in stock and ship to store &quot;123&quot;.
+        &quot;restrictedValues&quot;: [ # Only get facet for the given restricted values. For example, when using &quot;pickupInStore&quot; as key and set restricted values to [&quot;store123&quot;, &quot;store456&quot;], only facets for &quot;store123&quot; and &quot;store456&quot; are returned. Only supported on textual fields and fulfillments. Maximum is 20. Must be set for the fulfillment facet keys: * pickupInStore * shipToStore * sameDayDelivery * nextDayDelivery * customFulfillment1 * customFulfillment2 * customFulfillment3 * customFulfillment4 * customFulfillment5
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;limit&quot;: 42, # Maximum of facet values that should be returned for this facet. If unspecified, defaults to 20. The maximum allowed value is 300. Values above 300 will be coerced to 300. If this field is negative, an INVALID_ARGUMENT is returned.
+    },
+  ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. Filter expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#filter). If this field is unrecognizable, an INVALID_ARGUMENT is returned.
+  &quot;offset&quot;: 42, # A 0-indexed integer that specifies the current offset (that is, starting result location, amongst the Products deemed by the API as relevant) in search results. This field is only considered if page_token is unset. If this field is negative, an INVALID_ARGUMENT is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. Products can be ordered by a field in an Product object. Leave it unset if ordered by relevance. OrderBy expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#order). If this field is unrecognizable, an INVALID_ARGUMENT is returned.
+  &quot;pageCategories&quot;: [ # The categories associated with a category page. Required for category navigation queries to achieve good search quality. The format should be the same as UserEvent.page_categories; To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;].
+    &quot;A String&quot;,
+  ],
+  &quot;pageSize&quot;: 42, # Maximum number of Products to return. If unspecified, defaults to a reasonable value. The maximum allowed value is 120. Values above 120 will be coerced to 120. If this field is negative, an INVALID_ARGUMENT is returned.
+  &quot;pageToken&quot;: &quot;A String&quot;, # A page token SearchResponse.next_page_token, received from a previous SearchService.Search call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to SearchService.Search must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;query&quot;: &quot;A String&quot;, # Raw search query.
+  &quot;queryExpansionSpec&quot;: { # Specification to determine under which conditions query expansion should occur. # The query expansion specification that specifies the conditions under which query expansion will occur. See more details at this [user guide](/retail/private/docs/result-size#query_expansion).
+    &quot;condition&quot;: &quot;A String&quot;, # The condition under which query expansion should occur. Default to Condition.DISABLED.
+  },
+  &quot;relevanceThreshold&quot;: &quot;A String&quot;, # The relevance threshold of the search results. Defaults to RelevanceThreshold.HIGH, which means only the most relevant results are shown, and the least number of results are returned. See more details at this [user guide](/retail/private/docs/result-size#relevance_thresholding).
+  &quot;userInfo&quot;: { # Information of an end user. # User information.
+    &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  },
+  &quot;variantRollupKeys&quot;: [ # The keys to fetch and rollup the matching variant Products attributes. The attributes from all the matching variant Products are merged and de-duplicated. Notice that rollup variant Products attributes will lead to extra query latency. Maximum number of keys is 10. For Product.fulfillment_info, a fulfillment type and a fulfillment ID must be provided in the format of &quot;fulfillmentType.filfillmentId&quot;. E.g., in &quot;pickupInStore.store123&quot;, &quot;pickupInStore&quot; is fulfillment type and &quot;store123&quot; is the store ID. Supported keys are: * colorFamilies * price * originalPrice * discount * attributes.key, where key is any key in the Product.attributes map. * pickupInStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.PICKUP_IN_STORE. * shipToStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SHIP_TO_STORE. * sameDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SAME_DAY_DELIVERY. * nextDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * customFulfillment1.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_1. * customFulfillment2.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_2. * customFulfillment3.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_3. * customFulfillment4.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_4. * customFulfillment5.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_5. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    &quot;A String&quot;,
+  ],
+  &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for SearchService.Search method.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # A unique search token. This should be included in the UserEvent logs resulting from this search, which enables accurate attribution of search model performance.
+  &quot;correctedQuery&quot;: &quot;A String&quot;, # If spell correction applies, the corrected query. Otherwise, empty.
+  &quot;facets&quot;: [ # Results of facets requested by user.
+    { # A facet result.
+      &quot;dynamicFacet&quot;: True or False, # Whether the facet is dynamically generated.
+      &quot;key&quot;: &quot;A String&quot;, # The key for this facet. E.g., &quot;colorFamilies&quot; or &quot;price&quot; or &quot;attributes.attr1&quot;.
+      &quot;values&quot;: [ # The facet values for this field.
+        { # A facet value which contains value names and their count.
+          &quot;count&quot;: &quot;A String&quot;, # Number of items that have this facet value.
+          &quot;interval&quot;: { # A floating point interval. # Interval value for a facet, such as [10, 20) for facet &quot;price&quot;.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+          &quot;value&quot;: &quot;A String&quot;, # Text value of a facet, such as &quot;Black&quot; for facet &quot;colorFamilies&quot;.
+        },
+      ],
+    },
+  ],
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # A token that can be sent as SearchRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.
+  &quot;queryExpansionInfo&quot;: { # Information describing query expansion including whether expansion has occurred. # Query expansion information for the returned results.
+    &quot;expandedQuery&quot;: True or False, # Bool describing whether query expansion has occurred.
+  },
+  &quot;redirectUri&quot;: &quot;A String&quot;, # The URI of a customer-defined redirect page. If redirect action is triggered, no search will be performed, and only redirect_uri and attribution_token will be set in the response.
+  &quot;results&quot;: [ # A list of matched items. The order represents the ranking.
+    { # Represents the search results.
+      &quot;id&quot;: &quot;A String&quot;, # Product.id of the searched Product.
+      &quot;matchingVariantCount&quot;: 42, # The count of matched variant Products.
+      &quot;matchingVariantFields&quot;: { # If a variant Product matches the search query, this map indicates which Product fields are matched. The key is the Product.name, the value is a field mask of the matched Product fields. If matched attributes cannot be determined, this map will be empty. For example, a key &quot;sku1&quot; with field mask &quot;products.color_info&quot; indicates there is a match between &quot;sku1&quot; ColorInfo and the query.
+        &quot;a_key&quot;: &quot;A String&quot;,
+      },
+      &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # The product data snippet in the search response. Only Product.name is guaranteed to be populated. Product.variants contains the product variants that match the search query. If there are multiple product variants matching the query, top 5 most relevant product variants are returned and ordered by relevancy. If relevancy can be deternmined, use matching_variant_fields to look up matched product variants fields. If relevancy cannot be determined, e.g. when searching &quot;shoe&quot; all products in a shoe product can be a match, 5 product variants are returned but order is meaningless.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+          &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+            &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+              3.14,
+            ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+            &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+          },
+        },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+        &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
+        &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+          &quot;A String&quot;,
+        ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
+        &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+        &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+        &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+          { # Product thumbnail/detail image.
+            &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+            &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
+        &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
+        &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+          &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+          &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+          &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
+        },
+        &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
+        &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+          &quot;A String&quot;,
+        ],
+        &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+        &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+        &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2alphaProduct
+        ],
+      },
+      &quot;variantRollupValues&quot;: { # The rollup matching variant Product attributes. The key is one of the SearchRequest.variant_rollup_keys. The values are the merged and de-duplicated Product attributes. Notice that the rollup values are respect filter. For example, when filtering by &quot;colorFamilies:ANY(\&quot;red\&quot;)&quot; and rollup &quot;colorFamilies&quot;, only &quot;red&quot; is returned. For textual and numerical attributes, the rollup values is a list of string or double values with type google.protobuf.ListValue. For example, if there are two variants with colors &quot;red&quot; and &quot;blue&quot;, the rollup values are { key: &quot;colorFamilies&quot; value { list_value { values { string_value: &quot;red&quot; } values { string_value: &quot;blue&quot; } } } } For Product.fulfillment_info, the rollup values is a double value with type google.protobuf.Value. For example, {key: &quot;pickupInStore.store1&quot; value { number_value: 10 }} means a there are 10 variants in this product are available in the store &quot;store1&quot;.
+        &quot;a_key&quot;: &quot;&quot;,
+      },
+    },
+  ],
+  &quot;totalSize&quot;: 42, # The estimated total count of matched items irrespective of pagination. The count of results returned by pagination may be less than the total_size that matches.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="search_next">search_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>
+
 </body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2alpha.projects.locations.catalogs.userEvents.html b/docs/dyn/retail_v2alpha.projects.locations.catalogs.userEvents.html
index 9021879..9114003 100644
--- a/docs/dyn/retail_v2alpha.projects.locations.catalogs.userEvents.html
+++ b/docs/dyn/retail_v2alpha.projects.locations.catalogs.userEvents.html
@@ -141,14 +141,19 @@
   },
   &quot;inputConfig&quot;: { # The input config source for user events. # Required. The desired input location of the data.
     &quot;bigQuerySource&quot;: { # BigQuery source import data from. # Required. BigQuery input source.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
       &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
       &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
       &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
     },
     &quot;gcsSource&quot;: { # Google Cloud Storage location for input content. format. # Required. Google Cloud Storage location for the input content.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;inputUris&quot;: [ # Required. Google Cloud Storage URIs to input files. URI can be up to 2000 characters long. URIs can match the full object path (for example, `gs://bucket/directory/object.json`) or a pattern matching one or more files, such as `gs://bucket/directory/*.json`. A request can contain at most 100 files, and each file can be up to 2 GB. See [Importing product information](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog) for the expected file format and setup instructions.
         &quot;A String&quot;,
       ],
@@ -158,21 +163,31 @@
         { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
           &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
-          &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+          &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
           &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+          &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+            &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+            &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+            &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+          },
           &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
           &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
           &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
             &quot;A String&quot;,
           ],
+          &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
           &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
             &quot;A String&quot;,
           ],
@@ -180,23 +195,60 @@
           &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
             { # Detailed product information associated with a user event.
               &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-                &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+                &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
                   &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+                    &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
                     &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                       3.14,
                     ],
+                    &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
                     &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                       &quot;A String&quot;,
                     ],
                   },
                 },
+                &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+                  &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+                    &quot;A String&quot;,
+                  ],
+                  &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+                    &quot;A String&quot;,
+                  ],
+                },
                 &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
                 &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-                &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+                &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+                &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+                  &quot;A String&quot;,
+                ],
                 &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
                   &quot;A String&quot;,
                 ],
+                &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+                  &quot;A String&quot;,
+                ],
+                &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                  &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                    &quot;A String&quot;,
+                  ],
+                  &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                    &quot;A String&quot;,
+                  ],
+                },
+                &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+                  &quot;A String&quot;,
+                ],
                 &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+                &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+                &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+                  { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+                    &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                      &quot;A String&quot;,
+                    ],
+                    &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+                  },
+                ],
+                &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
                 &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
                 &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
                   { # Product thumbnail/detail image.
@@ -205,20 +257,64 @@
                     &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
                   },
                 ],
+                &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+                &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+                  &quot;A String&quot;,
+                ],
                 &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+                &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+                  &quot;A String&quot;,
+                ],
                 &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
                   &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-                  &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+                  &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
                   &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
                   &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+                  &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+                  &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+                  &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+                    &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                      &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                      &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                      &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                      &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+                    },
+                    &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                      &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                      &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                      &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                      &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+                    },
+                  },
                 },
                 &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+                &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+                  { # Promotion information.
+                    &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+                  },
+                ],
+                &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+                &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+                  &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+                  &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+                  &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+                    42,
+                  ],
+                },
+                &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+                  &quot;A String&quot;,
+                ],
                 &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
                   &quot;A String&quot;,
                 ],
                 &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+                &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
                 &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
                 &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+                &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+                  # Object with schema name: GoogleCloudRetailV2alphaProduct
+                ],
               },
               &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
             },
@@ -231,12 +327,13 @@
             &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
           },
           &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-          &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
           &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
           &quot;userInfo&quot;: { # Information of an end user. # User information.
             &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-            &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-            &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+            &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+            &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
             &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
           },
           &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -372,21 +469,31 @@
 { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
   &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
-  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
   &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+  &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+    &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+    &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+    &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+  },
   &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
   &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
   &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
     &quot;A String&quot;,
   ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
   &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;A String&quot;,
   ],
@@ -394,23 +501,60 @@
   &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
     { # Detailed product information associated with a user event.
       &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
           &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
             &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               3.14,
             ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
             &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               &quot;A String&quot;,
             ],
           },
         },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
         &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
         &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
         &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
           &quot;A String&quot;,
         ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
         &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
         &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
         &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
           { # Product thumbnail/detail image.
@@ -419,20 +563,64 @@
             &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
           },
         ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
         &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
         &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
           &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
           &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
           &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
         },
         &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
         &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
           &quot;A String&quot;,
         ],
         &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
         &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
         &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2alphaProduct
+        ],
       },
       &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
     },
@@ -445,12 +633,13 @@
     &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
   },
   &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
   &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
   &quot;userInfo&quot;: { # Information of an end user. # User information.
     &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
     &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
   },
   &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -467,21 +656,31 @@
     { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
   &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
-  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
   &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+  &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+    &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+    &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+    &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+  },
   &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
   &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
   &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
     &quot;A String&quot;,
   ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
   &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;A String&quot;,
   ],
@@ -489,23 +688,60 @@
   &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
     { # Detailed product information associated with a user event.
       &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
           &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
             &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               3.14,
             ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
             &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               &quot;A String&quot;,
             ],
           },
         },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
         &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
         &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
         &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
           &quot;A String&quot;,
         ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
         &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
         &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
         &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
           { # Product thumbnail/detail image.
@@ -514,20 +750,64 @@
             &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
           },
         ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
         &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
         &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
           &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
           &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
           &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
         },
         &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
         &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
           &quot;A String&quot;,
         ],
         &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
         &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
         &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2alphaProduct
+        ],
       },
       &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
     },
@@ -540,12 +820,13 @@
     &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
   },
   &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
   &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
   &quot;userInfo&quot;: { # Information of an end user. # User information.
     &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
     &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
   },
   &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
diff --git a/docs/dyn/retail_v2beta.projects.locations.catalogs.branches.products.html b/docs/dyn/retail_v2beta.projects.locations.catalogs.branches.products.html
index 08d8f5c..07554c5 100644
--- a/docs/dyn/retail_v2beta.projects.locations.catalogs.branches.products.html
+++ b/docs/dyn/retail_v2beta.projects.locations.catalogs.branches.products.html
@@ -75,6 +75,9 @@
 <h1><a href="retail_v2beta.html">Retail API</a> . <a href="retail_v2beta.projects.html">projects</a> . <a href="retail_v2beta.projects.locations.html">locations</a> . <a href="retail_v2beta.projects.locations.catalogs.html">catalogs</a> . <a href="retail_v2beta.projects.locations.catalogs.branches.html">branches</a> . <a href="retail_v2beta.projects.locations.catalogs.branches.products.html">products</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
+  <code><a href="#addFulfillmentPlaces">addFulfillmentPlaces(product, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
   <code><a href="#close">close()</a></code></p>
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
@@ -90,10 +93,69 @@
   <code><a href="#import_">import_(parent, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Bulk import of multiple Products. Request processing may be synchronous. No partial updating is supported. Non-existing items are created. Note that it is possible for a subset of the Products to be successfully updated.</p>
 <p class="toc_element">
+  <code><a href="#list">list(parent, filter=None, pageSize=None, pageToken=None, readMask=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Gets a list of Products.</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="#patch">patch(name, allowMissing=None, body=None, updateMask=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Updates a Product.</p>
+<p class="toc_element">
+  <code><a href="#removeFulfillmentPlaces">removeFulfillmentPlaces(product, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#setInventory">setInventory(name, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
 <h3>Method Details</h3>
 <div class="method">
+    <code class="details" id="addFulfillmentPlaces">addFulfillmentPlaces(product, body=None, x__xgafv=None)</code>
+  <pre>Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  product: string, Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for AddFulfillmentPlaces method.
+  &quot;addTime&quot;: &quot;A String&quot;, # The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;placeIds&quot;: [ # Required. The IDs for this type, such as the store IDs for &quot;pickup-in-store&quot; or the region IDs for &quot;same-day-delivery&quot; to be added for this type. Duplicate IDs will be automatically ignored. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned. If the total number of place IDs exceeds 2000 for this type after adding, then the update will be rejected.
+    &quot;A String&quot;,
+  ],
+  &quot;type&quot;: &quot;A String&quot;, # Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
     <code class="details" id="close">close()</code>
   <pre>Close httplib2 connections.</pre>
 </div>
@@ -108,23 +170,60 @@
     The object takes the form of:
 
 { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -133,20 +232,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2betaProduct
+  ],
 }
 
   productId: string, Required. The ID to use for the Product, which will become the final component of the Product.name. If the caller does not have permission to create the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. This field must be unique among all Products with the same parent. Otherwise, an ALREADY_EXISTS error is returned. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
@@ -159,23 +302,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -184,20 +364,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2betaProduct
+  ],
 }</pre>
 </div>
 
@@ -234,23 +458,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -259,20 +520,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2betaProduct
+  ],
 }</pre>
 </div>
 
@@ -291,14 +596,19 @@
   },
   &quot;inputConfig&quot;: { # The input config source for products. # Required. The desired input location of the data.
     &quot;bigQuerySource&quot;: { # BigQuery source import data from. # BigQuery input source.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
       &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
       &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
       &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
     },
     &quot;gcsSource&quot;: { # Google Cloud Storage location for input content. format. # Google Cloud Storage location for the input content.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;inputUris&quot;: [ # Required. Google Cloud Storage URIs to input files. URI can be up to 2000 characters long. URIs can match the full object path (for example, `gs://bucket/directory/object.json`) or a pattern matching one or more files, such as `gs://bucket/directory/*.json`. A request can contain at most 100 files, and each file can be up to 2 GB. See [Importing product information](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog) for the expected file format and setup instructions.
         &quot;A String&quot;,
       ],
@@ -306,23 +616,60 @@
     &quot;productInlineSource&quot;: { # The inline source for the input config for ImportProducts method. # The Inline source for the input content for products.
       &quot;products&quot;: [ # Required. A list of products to update/create. Each product must have a valid Product.id. Recommended max of 100 items.
         { # Product captures all metadata information of items to be recommended or searched.
-          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
+          &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+            &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+              &quot;A String&quot;,
+            ],
+            &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+              &quot;A String&quot;,
+            ],
+          },
           &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
           &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+          &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+            &quot;A String&quot;,
+          ],
           &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
             &quot;A String&quot;,
           ],
+          &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+            &quot;A String&quot;,
+          ],
+          &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+            &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+          },
+          &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+            &quot;A String&quot;,
+          ],
           &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+          &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+          &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+            { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+              &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;A String&quot;,
+              ],
+              &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+            },
+          ],
+          &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
           &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
           &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
             { # Product thumbnail/detail image.
@@ -331,24 +678,71 @@
               &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
             },
           ],
+          &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+          &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+            &quot;A String&quot;,
+          ],
           &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+          &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+            &quot;A String&quot;,
+          ],
           &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
             &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
             &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
             &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+            &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+              &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+              &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+            },
           },
           &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+          &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+            { # Promotion information.
+              &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+            },
+          ],
+          &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+          &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+            &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+              42,
+            ],
+          },
+          &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+            &quot;A String&quot;,
+          ],
           &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
             &quot;A String&quot;,
           ],
           &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+          &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
           &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
           &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+          &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            # Object with schema name: GoogleCloudRetailV2betaProduct
+          ],
         },
       ],
     },
   },
+  &quot;notificationPubsubTopic&quot;: &quot;A String&quot;, # Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+  &quot;reconciliationMode&quot;: &quot;A String&quot;, # The mode of reconciliation between existing products and the products to be imported. Defaults to ReconciliationMode.INCREMENTAL.
+  &quot;requestId&quot;: &quot;A String&quot;, # Unique identifier provided by client, within the ancestor dataset scope. Ensures idempotency and used for request deduplication. Server-generated if unspecified. Up to 128 characters long and must match the pattern: &quot;[a-zA-Z0-9_]+&quot;. This is returned as Operation.name in ImportMetadata. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
   &quot;updateMask&quot;: &quot;A String&quot;, # Indicates which fields in the provided imported &#x27;products&#x27; to update. If not set, will by default update all fields.
 }
 
@@ -382,6 +776,167 @@
 </div>
 
 <div class="method">
+    <code class="details" id="list">list(parent, filter=None, pageSize=None, pageToken=None, readMask=None, x__xgafv=None)</code>
+  <pre>Gets a list of Products.
+
+Args:
+  parent: string, Required. The parent branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use `default_branch` as the branch ID, to list products under the default branch. If the caller does not have permission to list Products under this branch, regardless of whether or not this branch exists, a PERMISSION_DENIED error is returned. (required)
+  filter: string, A filter to apply on the list results. Supported features: * List all the products under the parent branch if filter is unset. * List Product.Type.VARIANT Products sharing the same Product.Type.PRIMARY Product. For example: `primary_product_id = &quot;some_product_id&quot;` * List Products bundled in a Product.Type.COLLECTION Product. For example: `collection_product_id = &quot;some_product_id&quot;` * List Products with a partibular type. For example: `type = &quot;PRIMARY&quot;` `type = &quot;VARIANT&quot;` `type = &quot;COLLECTION&quot;` If the field is unrecognizable, an INVALID_ARGUMENT error is returned. If the specified Product.Type.PRIMARY Product or Product.Type.COLLECTION Product does not exist, a NOT_FOUND error is returned.
+  pageSize: integer, Maximum number of Products to return. If unspecified, defaults to 100. The maximum allowed value is 1000. Values above 1000 will be coerced to 1000. If this field is negative, an INVALID_ARGUMENT error is returned.
+  pageToken: string, A page token ListProductsResponse.next_page_token, received from a previous ProductService.ListProducts call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to ProductService.ListProducts must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.
+  readMask: string, The fields of Product to return in the responses. If not set or empty, the following fields are returned: * Product.name * Product.id * Product.title * Product.uri * Product.images * Product.price_info * Product.brands If &quot;*&quot; is provided, all fields are returned. Product.name is always returned no matter what mask is set. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for ProductService.ListProducts method.
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # A token that can be sent as ListProductsRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.
+  &quot;products&quot;: [ # The Products.
+    { # Product captures all metadata information of items to be recommended or searched.
+      &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+        &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+          &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+          &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            3.14,
+          ],
+          &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+          &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+        },
+      },
+      &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+        &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+          &quot;A String&quot;,
+        ],
+        &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+      &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+      &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+      &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+        &quot;A String&quot;,
+      ],
+      &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+        &quot;A String&quot;,
+      ],
+      &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+        &quot;A String&quot;,
+      ],
+      &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;A String&quot;,
+        ],
+        &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+        &quot;A String&quot;,
+      ],
+      &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+      &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+      &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+        { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+          &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+          &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+        },
+      ],
+      &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+      &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+      &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+        { # Product thumbnail/detail image.
+          &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+          &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        },
+      ],
+      &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+      &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+        &quot;A String&quot;,
+      ],
+      &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+      &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+        &quot;A String&quot;,
+      ],
+      &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+        &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+        &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+        &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+        &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+        &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+        &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+        &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+          &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+        },
+      },
+      &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+      &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+        { # Promotion information.
+          &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+        },
+      ],
+      &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+      &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+        &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+          42,
+        ],
+      },
+      &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+        &quot;A String&quot;,
+      ],
+      &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+        &quot;A String&quot;,
+      ],
+      &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+      &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+      &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+      &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+      &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+        # Object with schema name: GoogleCloudRetailV2betaProduct
+      ],
+    },
+  ],
+}</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="patch">patch(name, allowMissing=None, body=None, updateMask=None, x__xgafv=None)</code>
   <pre>Updates a Product.
 
@@ -391,23 +946,60 @@
     The object takes the form of:
 
 { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -416,20 +1008,64 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2betaProduct
+  ],
 }
 
   allowMissing: boolean, If set to true, and the Product is not found, a new Product will be created. In this situation, `update_mask` is ignored.
@@ -443,23 +1079,60 @@
   An object of the form:
 
     { # Product captures all metadata information of items to be recommended or searched.
-  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+  &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
+  &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+    &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+      &quot;A String&quot;,
+    ],
+    &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+      &quot;A String&quot;,
+    ],
+  },
   &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
   &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+  &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+  &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+    &quot;A String&quot;,
+  ],
   &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
     &quot;A String&quot;,
   ],
+  &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+    &quot;A String&quot;,
+  ],
+  &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+    &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+    &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+    &quot;A String&quot;,
+  ],
   &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+  &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+  &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+      &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    },
+  ],
+  &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
   &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
   &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
     { # Product thumbnail/detail image.
@@ -468,20 +1141,277 @@
       &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
     },
   ],
+  &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+  &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+    &quot;A String&quot;,
+  ],
   &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+  &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+    &quot;A String&quot;,
+  ],
   &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
     &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
     &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
     &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+    &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+    &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+      &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+        &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+        &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+        &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+        &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+      },
+    },
   },
   &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+  &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+    { # Promotion information.
+      &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+    },
+  ],
+  &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+  &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+    &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+      42,
+    ],
+  },
+  &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+    &quot;A String&quot;,
+  ],
   &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
     &quot;A String&quot;,
   ],
   &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+  &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
   &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
   &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+  &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+    # Object with schema name: GoogleCloudRetailV2betaProduct
+  ],
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="removeFulfillmentPlaces">removeFulfillmentPlaces(product, body=None, x__xgafv=None)</code>
+  <pre>Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  product: string, Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for RemoveFulfillmentPlaces method.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;placeIds&quot;: [ # Required. The IDs for this type, such as the store IDs for &quot;pickup-in-store&quot; or the region IDs for &quot;same-day-delivery&quot;, to be removed for this type. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;A String&quot;,
+  ],
+  &quot;removeTime&quot;: &quot;A String&quot;, # The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.
+  &quot;type&quot;: &quot;A String&quot;, # Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="setInventory">setInventory(name, body=None, x__xgafv=None)</code>
+  <pre>Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  name: string, Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for SetInventory method.
+  &quot;allowMissing&quot;: True or False, # If set to true, and the Product with name Product.name is not found, the inventory update will still be processed and retained for at most 1 day until the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.
+  &quot;inventory&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. The inventory information to update. The allowable fields to update are: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info The updated inventory fields must be specified in SetInventoryRequest.set_mask. If SetInventoryRequest.inventory.name is empty or invalid, an INVALID_ARGUMENT error is returned. If the caller does not have permission to update the Product named in Product.name, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. If the Product to update does not have existing inventory information, the provided inventory information will be inserted. If the Product to update has existing inventory information, the provided inventory information will be merged while respecting the last update time for each inventory field, using the provided or default value for SetInventoryRequest.set_time. The last update time is recorded for the following inventory fields: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info If a full overwrite of inventory information while ignoring timestamps is needed, UpdateProduct should be invoked instead.
+    &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+      &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+        &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+        &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+          3.14,
+        ],
+        &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+        &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;A String&quot;,
+        ],
+      },
+    },
+    &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+      &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+        &quot;A String&quot;,
+      ],
+      &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+    &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+    &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+    &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+      &quot;A String&quot;,
+    ],
+    &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+      &quot;A String&quot;,
+    ],
+    &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+      &quot;A String&quot;,
+    ],
+    &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+      &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;A String&quot;,
+      ],
+      &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+      &quot;A String&quot;,
+    ],
+    &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+    &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+    &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+      { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+        &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;A String&quot;,
+        ],
+        &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+      },
+    ],
+    &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+    &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+    &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+      { # Product thumbnail/detail image.
+        &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+        &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+      },
+    ],
+    &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+    &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+      &quot;A String&quot;,
+    ],
+    &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+    &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+      &quot;A String&quot;,
+    ],
+    &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+      &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+      &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+      &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+      &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+      &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+      &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+      &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+        &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+          &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+          &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+          &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+          &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+        },
+        &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+          &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+          &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+          &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+          &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+        },
+      },
+    },
+    &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+    &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+      { # Promotion information.
+        &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+      },
+    ],
+    &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+    &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+      &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+      &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+        42,
+      ],
+    },
+    &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+      &quot;A String&quot;,
+    ],
+    &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+      &quot;A String&quot;,
+    ],
+    &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+    &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+    &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+    &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+    &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+      # Object with schema name: GoogleCloudRetailV2betaProduct
+    ],
+  },
+  &quot;setMask&quot;: &quot;A String&quot;, # Indicates which inventory fields in the provided Product to update. If not set or set with empty paths, all inventory fields will be updated. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned and the entire update will be ignored.
+  &quot;setTime&quot;: &quot;A String&quot;, # The time when the request is issued, used to prevent out-of-order updates on inventory fields with the last update time recorded. If not provided, the internal system time will be used.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
 }</pre>
 </div>
 
diff --git a/docs/dyn/retail_v2beta.projects.locations.catalogs.completionData.html b/docs/dyn/retail_v2beta.projects.locations.catalogs.completionData.html
new file mode 100644
index 0000000..c1341ed
--- /dev/null
+++ b/docs/dyn/retail_v2beta.projects.locations.catalogs.completionData.html
@@ -0,0 +1,145 @@
+<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="retail_v2beta.html">Retail API</a> . <a href="retail_v2beta.projects.html">projects</a> . <a href="retail_v2beta.projects.locations.html">locations</a> . <a href="retail_v2beta.projects.locations.catalogs.html">catalogs</a> . <a href="retail_v2beta.projects.locations.catalogs.completionData.html">completionData</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="#import_">import_(parent, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</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="import_">import_(parent, body=None, x__xgafv=None)</code>
+  <pre>Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  parent: string, Required. The catalog which the suggestions dataset belongs to. Format: `projects/1234/locations/global/catalogs/default_catalog`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for ImportCompletionData methods.
+  &quot;inputConfig&quot;: { # The input config source for completion data. # Required. The desired input location of the data.
+    &quot;bigQuerySource&quot;: { # BigQuery source import data from. # Required. BigQuery input source. Add the IAM permission “BigQuery Data Viewer” for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
+      &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
+      &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
+      &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
+      &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
+    },
+  },
+  &quot;notificationPubsubTopic&quot;: &quot;A String&quot;, # Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # This resource represents a long-running operation that is the result of a network API call.
+  &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.
+  &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors). # The error result of the operation in case of failure or cancellation.
+    &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
+    &quot;details&quot;: [ # A list of messages that carry the error details. There is a common set of message types for APIs to use.
+      {
+        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+    &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
+  },
+  &quot;metadata&quot;: { # Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.
+  &quot;response&quot;: { # The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.
+    &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
+  },
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2beta.projects.locations.catalogs.html b/docs/dyn/retail_v2beta.projects.locations.catalogs.html
index ddf57c6..b060f4f 100644
--- a/docs/dyn/retail_v2beta.projects.locations.catalogs.html
+++ b/docs/dyn/retail_v2beta.projects.locations.catalogs.html
@@ -80,6 +80,11 @@
 <p class="firstline">Returns the branches Resource.</p>
 
 <p class="toc_element">
+  <code><a href="retail_v2beta.projects.locations.catalogs.completionData.html">completionData()</a></code>
+</p>
+<p class="firstline">Returns the completionData Resource.</p>
+
+<p class="toc_element">
   <code><a href="retail_v2beta.projects.locations.catalogs.operations.html">operations()</a></code>
 </p>
 <p class="firstline">Returns the operations Resource.</p>
@@ -98,6 +103,12 @@
   <code><a href="#close">close()</a></code></p>
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
+  <code><a href="#completeQuery">completeQuery(catalog, dataset=None, deviceType=None, languageCodes=None, maxSuggestions=None, query=None, visitorId=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#getDefaultBranch">getDefaultBranch(catalog, x__xgafv=None)</a></code></p>
+<p class="firstline">Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
   <code><a href="#list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Lists all the Catalogs associated with the project.</p>
 <p class="toc_element">
@@ -106,6 +117,9 @@
 <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 Catalogs.</p>
+<p class="toc_element">
+  <code><a href="#setDefaultBranch">setDefaultBranch(catalog, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using "default_branch" to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -113,6 +127,74 @@
 </div>
 
 <div class="method">
+    <code class="details" id="completeQuery">completeQuery(catalog, dataset=None, deviceType=None, languageCodes=None, maxSuggestions=None, query=None, visitorId=None, x__xgafv=None)</code>
+  <pre>Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, Required. Catalog for which the completion is performed. Full resource name of catalog, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  dataset: string, Determines which dataset to use for fetching completion. &quot;user-data&quot; will use the imported dataset through ImportCompletionData. &quot;cloud-retail&quot; will use the dataset generated by cloud retail based on user events. If leave empty, it will use the &quot;user-data&quot;. Current supported values: * user-data * cloud-retail This option is not automatically enabled. Before using cloud-retail, contact retail-search-support@google.com first.
+  deviceType: string, The device type context for completion suggestions. It is useful to apply different suggestions on different device types, e.g. DESKTOP, MOBILE. If it is empty, the suggestions are across all device types. Supported formats: * UNKNOWN_DEVICE_TYPE * DESKTOP * MOBILE * A customized string starts with OTHER_, e.g. OTHER_IPHONE.
+  languageCodes: string, The list of languages of the query. This is the BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more information, see [Tags for Identifying Languages](https://tools.ietf.org/html/bcp47). The maximum number of allowed characters is 255. Only &quot;en-US&quot; is currently supported. (repeated)
+  maxSuggestions: integer, Completion max suggestions. The maximum allowed max suggestions is 20. The default value is 20.
+  query: string, Required. The query used to generate suggestions. The maximum number of allowed characters is 255.
+  visitorId: string, A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response of the auto-complete query.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # A unique complete token. This should be included in the SearchRequest resulting from this completion, which enables accurate attribution of complete model performance.
+  &quot;completionResults&quot;: [ # Results of the matching suggestions. The result list is ordered and the first result is top suggestion.
+    { # Resource that represents completion results.
+      &quot;attributes&quot;: { # Additional custom attributes ingested through BigQuery.
+        &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+          &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+          &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            3.14,
+          ],
+          &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+          &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;A String&quot;,
+          ],
+        },
+      },
+      &quot;suggestion&quot;: &quot;A String&quot;, # The suggestion for the query.
+    },
+  ],
+  &quot;recentSearchResults&quot;: [ # Matched recent searches of this user. This field is a restricted feature. Contact Retail Support (retail-search-support@google.com) if you are interested in enabling it. This feature is only available when CompleteQueryRequest.visitor_id field is set and UserEvent is imported. The recent searches satisfy the follow rules: * They are ordered from latest to oldest. * They are matched with CompleteQueryRequest.query case insensitively. * They are transformed to lower cases. * They are UTF-8 safe. Recent searches are deduplicated. More recent searches will be reserved when duplication happens.
+    { # Recent search of this user.
+      &quot;recentSearch&quot;: &quot;A String&quot;, # The recent search query.
+    },
+  ],
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="getDefaultBranch">getDefaultBranch(catalog, x__xgafv=None)</code>
+  <pre>Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, The parent catalog resource name, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message of CatalogService.GetDefaultBranch.
+  &quot;branch&quot;: &quot;A String&quot;, # Full resource name of the branch id currently set as default branch.
+  &quot;note&quot;: &quot;A String&quot;, # This corresponds to SetDefaultBranchRequest.note field, when this branch was set as default.
+  &quot;setTime&quot;: &quot;A String&quot;, # The time when this branch is set to default.
+}</pre>
+</div>
+
+<div class="method">
     <code class="details" id="list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</code>
   <pre>Lists all the Catalogs associated with the project.
 
@@ -194,4 +276,30 @@
 }</pre>
 </div>
 
+<div class="method">
+    <code class="details" id="setDefaultBranch">setDefaultBranch(catalog, body=None, x__xgafv=None)</code>
+  <pre>Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using &quot;default_branch&quot; to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  catalog: string, Full resource name of the catalog, such as `projects/*/locations/global/catalogs/default_catalog`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message to set a specified branch as new default_branch.
+  &quot;branchId&quot;: &quot;A String&quot;, # The final component of the resource name of a branch. This field must be one of &quot;0&quot;, &quot;1&quot; or &quot;2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;note&quot;: &quot;A String&quot;, # Some note on this request, this can be retrieved by CatalogService.GetDefaultBranch before next valid default branch set occurs. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+}
+
+  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>
+
 </body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2beta.projects.locations.catalogs.placements.html b/docs/dyn/retail_v2beta.projects.locations.catalogs.placements.html
index 446f9c1..af31af4 100644
--- a/docs/dyn/retail_v2beta.projects.locations.catalogs.placements.html
+++ b/docs/dyn/retail_v2beta.projects.locations.catalogs.placements.html
@@ -80,6 +80,12 @@
 <p class="toc_element">
   <code><a href="#predict">predict(placement, body=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Makes a recommendation prediction.</p>
+<p class="toc_element">
+  <code><a href="#search">search(placement, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.</p>
+<p class="toc_element">
+  <code><a href="#search_next">search_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -108,21 +114,31 @@
   &quot;userEvent&quot;: { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website. # Required. Context about the user, what they are looking at and what action they took to trigger the predict request. Note that this user event detail won&#x27;t be ingested to userEvent logs. Thus, a separate userEvent write request is required for event logging.
     &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
       &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+        &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
         &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
           3.14,
         ],
+        &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
         &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
           &quot;A String&quot;,
         ],
       },
     },
-    &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+    &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
     &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+    &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+      &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+      &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+      &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+    },
     &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
     &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
     &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
       &quot;A String&quot;,
     ],
+    &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
       &quot;A String&quot;,
     ],
@@ -130,23 +146,60 @@
     &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
       { # Detailed product information associated with a user event.
         &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+          &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
+          &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+            &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+              &quot;A String&quot;,
+            ],
+            &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+              &quot;A String&quot;,
+            ],
+          },
           &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
           &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+          &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+          &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+            &quot;A String&quot;,
+          ],
           &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
             &quot;A String&quot;,
           ],
+          &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+            &quot;A String&quot;,
+          ],
+          &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+            &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+              &quot;A String&quot;,
+            ],
+          },
+          &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+            &quot;A String&quot;,
+          ],
           &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+          &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+          &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+            { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+              &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;A String&quot;,
+              ],
+              &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+            },
+          ],
+          &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
           &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
           &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
             { # Product thumbnail/detail image.
@@ -155,20 +208,64 @@
               &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
             },
           ],
+          &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+          &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+            &quot;A String&quot;,
+          ],
           &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+          &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+            &quot;A String&quot;,
+          ],
           &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
             &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+            &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
             &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
             &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+            &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+            &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+              &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+              &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+              },
+            },
           },
           &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+          &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+            { # Promotion information.
+              &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+            },
+          ],
+          &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+          &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+            &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+              42,
+            ],
+          },
+          &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+            &quot;A String&quot;,
+          ],
           &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
             &quot;A String&quot;,
           ],
           &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+          &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
           &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
           &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+          &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            # Object with schema name: GoogleCloudRetailV2betaProduct
+          ],
         },
         &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
       },
@@ -181,12 +278,13 @@
       &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
     },
     &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-    &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+    &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
     &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
     &quot;userInfo&quot;: { # Information of an end user. # User information.
       &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-      &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-      &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+      &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+      &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
       &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
     },
     &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -219,4 +317,268 @@
 }</pre>
 </div>
 
+<div class="method">
+    <code class="details" id="search">search(placement, body=None, x__xgafv=None)</code>
+  <pre>Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.
+
+Args:
+  placement: string, Required. The resource name of the search engine placement, such as `projects/*/locations/global/catalogs/default_catalog/placements/default_search`. This field is used to identify the set of models that will be used to make the search. We currently support one placement with the following ID: * `default_search`. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Request message for SearchService.Search method.
+  &quot;boostSpec&quot;: { # Boost specification to boost certain items. # Boost specification to boost certain products. See more details at this [user guide](/retail/private/docs/boosting).
+    &quot;conditionBoostSpecs&quot;: [ # Condition boost specifications. If a product matches multiple conditions in the specifictions, boost scores from these specifications are all applied and combined in a non-linear way. Maximum number of specifications is 10.
+      { # Boost applies to products which match a condition.
+        &quot;boost&quot;: 3.14, # Strength of the condition boost, which should be in [-1, 1]. Negative boost means demotion. Default is 0.0. Setting to 1.0 gives the item a big promotion. However, it does not necessarily mean that the boosted item will be the top result at all times, nor that other items will be excluded. Results could still be shown even when none of them matches the condition. And results that are significantly more relevant to the search query can still trump your heavily favored but irrelevant items. Setting to -1.0 gives the item a big demotion. However, results that are deeply relevant might still be shown. The item will have an upstream battle to get a fairly high ranking, but it is not blocked out completely. Setting to 0.0 means no boost applied. The boosting condition is ignored.
+        &quot;condition&quot;: &quot;A String&quot;, # An expression which specifies a boost condition. The syntax and supported fields are the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Examples: * To boost products with product ID &quot;product_1&quot; or &quot;product_2&quot;, and color &quot;Red&quot; or &quot;Blue&quot;: *(id: ANY(&quot;product_1&quot;, &quot;product_2&quot;)) * *AND * *(colorFamilies: ANY(&quot;Red&quot;, &quot;Blue&quot;)) *
+      },
+    ],
+  },
+  &quot;branch&quot;: &quot;A String&quot;, # The branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use &quot;default_branch&quot; as the branch ID or leave this field empty, to search products under the default branch.
+  &quot;canonicalFilter&quot;: &quot;A String&quot;, # The filter applied to every search request when quality improvement such as query expansion is needed. For example, if a query does not have enough results, an expanded query with SearchRequest.canonical_filter will be returned as a supplement of the original query. This field is strongly recommended to achieve high search quality. See SearchRequest.filter for more details about filter syntax.
+  &quot;dynamicFacetSpec&quot;: { # The specifications of dynamically generated facets. # The specification for dynamically generated facets. Notice that only textual facets can be dynamically generated. This feature requires additional allowlisting. Contact Retail Support (retail-search-support@google.com) if you are interested in using dynamic facet feature.
+    &quot;mode&quot;: &quot;A String&quot;, # Mode of the DynamicFacet feature. Defaults to Mode.DISABLED if it&#x27;s unset.
+  },
+  &quot;facetSpecs&quot;: [ # Facet specifications for faceted search. If empty, no facets are returned. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.
+    { # A facet specification to perform faceted search.
+      &quot;enableDynamicPosition&quot;: True or False, # Enables dynamic position for this facet. If set to true, the position of this facet among all facets in the response is determined by Google Retail Search. It will be ordered together with dynamic facets if dynamic facets is enabled. If set to false, the position of this facet in the response will be the same as in the request, and it will be ranked before the facets with dynamic position enable and all dynamic facets. For example, you may always want to have rating facet returned in the response, but it&#x27;s not necessarily to always display the rating facet at the top. In that case, you can set enable_dynamic_position to true so that the position of rating facet in response will be determined by Google Retail Search. Another example, assuming you have the following facets in the request: * &quot;rating&quot;, enable_dynamic_position = true * &quot;price&quot;, enable_dynamic_position = false * &quot;brands&quot;, enable_dynamic_position = false And also you have a dynamic facets enable, which will generate a facet &#x27;gender&#x27;. Then the final order of the facets in the response can be (&quot;price&quot;, &quot;brands&quot;, &quot;rating&quot;, &quot;gender&quot;) or (&quot;price&quot;, &quot;brands&quot;, &quot;gender&quot;, &quot;rating&quot;) depends on how Google Retail Search orders &quot;gender&quot; and &quot;rating&quot; facets. However, notice that &quot;price&quot; and &quot;brands&quot; will always be ranked at 1st and 2nd position since their enable_dynamic_position are false.
+      &quot;excludedFilterKeys&quot;: [ # List of keys to exclude when faceting. By default, FacetKey.key is not excluded from the filter unless it is listed in this field. For example, suppose there are 100 products with color facet &quot;Red&quot; and 200 products with color facet &quot;Blue&quot;. A query containing the filter &quot;colorFamilies:ANY(&quot;Red&quot;)&quot; and have &quot;colorFamilies&quot; as FacetKey.key will by default return the &quot;Red&quot; with count 100. If this field contains &quot;colorFamilies&quot;, then the query returns both the &quot;Red&quot; with count 100 and &quot;Blue&quot; with count 200, because the &quot;colorFamilies&quot; key is now excluded from the filter. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;A String&quot;,
+      ],
+      &quot;facetKey&quot;: { # Specifies how a facet is computed. # Required. The facet key specification.
+        &quot;contains&quot;: [ # Only get facet values that contains the given strings. For example, suppose &quot;categories&quot; has three values &quot;Women &gt; Shoe&quot;, &quot;Women &gt; Dress&quot; and &quot;Men &gt; Shoe&quot;. If set &quot;contains&quot; to &quot;Shoe&quot;, the &quot;categories&quot; facet will give only &quot;Women &gt; Shoe&quot; and &quot;Men &gt; Shoe&quot;. Only supported on textual fields. Maximum is 10.
+          &quot;A String&quot;,
+        ],
+        &quot;intervals&quot;: [ # Set only if values should be bucketized into intervals. Must be set for facets with numerical values. Must not be set for facet with text values. Maximum number of intervals is 30.
+          { # A floating point interval.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+        ],
+        &quot;key&quot;: &quot;A String&quot;, # Required. Supported textual and numerical facet keys in Product object, over which the facet values are computed. Facet key is case-sensitive. Allowed facet keys when FacetKey.query is not specified: * textual_field = *# The Product.brands. * &quot;brands&quot;; *# The Product.categories. * &quot;categories&quot;; *# The Audience.genders. * | &quot;genders&quot;; *# The Audience.age_groups. * | &quot;ageGroups&quot;; *# The Product.availability. Value is one of * *# &quot;IN_STOCK&quot;, &quot;OUT_OF_STOCK&quot;, PREORDER&quot;, &quot;BACKORDER&quot;. * | &quot;availability&quot;; *# The ColorInfo.color_families. * | &quot;colorFamilies&quot;; *# The ColorInfo.colors. * | &quot;colors&quot;; *# The Product.sizes. * | &quot;sizes&quot;; *# The Product.materials. * | &quot;materials&quot;; *# The Product.patterns. * | &quot;patterns&quot;; *# The Product.conditions. * | &quot;conditions&quot;; *# The textual custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are textual. * *# map. * | &quot;attributes.key&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.PICKUP_IN_STORE. * | &quot;pickupInStore&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SHIP_TO_STORE. * | &quot;shipToStore&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SAME_DAY_DELIVERY. * | &quot;sameDayDelivery&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * | &quot;nextDayDelivery&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_1. * | &quot;customFulfillment1&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_2. * | &quot;customFulfillment2&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_3. * | &quot;customFulfillment3&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_4. * | &quot;customFulfillment4&quot;; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_5. * | &quot;customFulfillment5&quot;; * numerical_field = *# The PriceInfo.price. * &quot;price&quot;; *# The discount. Computed by (original_price-price)/price * &quot;discount&quot;; *# The Rating.average_rating. * &quot;rating&quot;; *# The Rating.rating_count. * &quot;ratingCount&quot;; *# The numerical custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are numerical. * | &quot;attributes.key&quot;;
+        &quot;orderBy&quot;: &quot;A String&quot;, # The order in which Facet.values are returned. Allowed values are: * &quot;count desc&quot;, which means order by Facet.FacetValue.count descending. * &quot;value desc&quot;, which means order by Facet.FacetValue.value descending. Only applies to textual facets. If not set, textual values are sorted in [natural order](https://en.wikipedia.org/wiki/Natural_sort_order); numerical intervals are sorted in the order given by FacetSpec.FacetKey.intervals; FulfillmentInfo.ids are sorted in the order given by FacetSpec.FacetKey.restricted_values.
+        &quot;prefixes&quot;: [ # Only get facet values that start with the given string prefix. For example, suppose &quot;categories&quot; has three values &quot;Women &gt; Shoe&quot;, &quot;Women &gt; Dress&quot; and &quot;Men &gt; Shoe&quot;. If set &quot;prefixes&quot; to &quot;Women&quot;, the &quot;categories&quot; facet will give only &quot;Women &gt; Shoe&quot; and &quot;Women &gt; Dress&quot;. Only supported on textual fields. Maximum is 10.
+          &quot;A String&quot;,
+        ],
+        &quot;query&quot;: &quot;A String&quot;, # The query that is used to compute facet for the given facet key. When provided, it will override the default behavior of facet computation. The query syntax is the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Notice that there is no limitation on FacetKey.key when query is specified. In the response, FacetValue.value will be always &quot;1&quot; and FacetValue.count will be the number of results that matches the query. For example, you can set a customized facet for &quot;shipToStore&quot;, where FacetKey.key is &quot;customizedShipToStore&quot;, and FacetKey.query is &quot;availability: ANY(\&quot;IN_STOCK\&quot;) AND shipToStore: ANY(\&quot;123\&quot;)&quot;. Then the facet will count the products that are both in stock and ship to store &quot;123&quot;.
+        &quot;restrictedValues&quot;: [ # Only get facet for the given restricted values. For example, when using &quot;pickupInStore&quot; as key and set restricted values to [&quot;store123&quot;, &quot;store456&quot;], only facets for &quot;store123&quot; and &quot;store456&quot; are returned. Only supported on textual fields and fulfillments. Maximum is 20. Must be set for the fulfillment facet keys: * pickupInStore * shipToStore * sameDayDelivery * nextDayDelivery * customFulfillment1 * customFulfillment2 * customFulfillment3 * customFulfillment4 * customFulfillment5
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;limit&quot;: 42, # Maximum of facet values that should be returned for this facet. If unspecified, defaults to 20. The maximum allowed value is 300. Values above 300 will be coerced to 300. If this field is negative, an INVALID_ARGUMENT is returned.
+    },
+  ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. Filter expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#filter). If this field is unrecognizable, an INVALID_ARGUMENT is returned.
+  &quot;offset&quot;: 42, # A 0-indexed integer that specifies the current offset (that is, starting result location, amongst the Products deemed by the API as relevant) in search results. This field is only considered if page_token is unset. If this field is negative, an INVALID_ARGUMENT is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. Products can be ordered by a field in an Product object. Leave it unset if ordered by relevance. OrderBy expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#order). If this field is unrecognizable, an INVALID_ARGUMENT is returned.
+  &quot;pageCategories&quot;: [ # The categories associated with a category page. Required for category navigation queries to achieve good search quality. The format should be the same as UserEvent.page_categories; To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;].
+    &quot;A String&quot;,
+  ],
+  &quot;pageSize&quot;: 42, # Maximum number of Products to return. If unspecified, defaults to a reasonable value. The maximum allowed value is 120. Values above 120 will be coerced to 120. If this field is negative, an INVALID_ARGUMENT is returned.
+  &quot;pageToken&quot;: &quot;A String&quot;, # A page token SearchResponse.next_page_token, received from a previous SearchService.Search call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to SearchService.Search must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;query&quot;: &quot;A String&quot;, # Raw search query.
+  &quot;queryExpansionSpec&quot;: { # Specification to determine under which conditions query expansion should occur. # The query expansion specification that specifies the conditions under which query expansion will occur. See more details at this [user guide](/retail/private/docs/result-size#query_expansion).
+    &quot;condition&quot;: &quot;A String&quot;, # The condition under which query expansion should occur. Default to Condition.DISABLED.
+  },
+  &quot;userInfo&quot;: { # Information of an end user. # User information.
+    &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  },
+  &quot;variantRollupKeys&quot;: [ # The keys to fetch and rollup the matching variant Products attributes. The attributes from all the matching variant Products are merged and de-duplicated. Notice that rollup variant Products attributes will lead to extra query latency. Maximum number of keys is 10. For Product.fulfillment_info, a fulfillment type and a fulfillment ID must be provided in the format of &quot;fulfillmentType.filfillmentId&quot;. E.g., in &quot;pickupInStore.store123&quot;, &quot;pickupInStore&quot; is fulfillment type and &quot;store123&quot; is the store ID. Supported keys are: * colorFamilies * price * originalPrice * discount * attributes.key, where key is any key in the Product.attributes map. * pickupInStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.PICKUP_IN_STORE. * shipToStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SHIP_TO_STORE. * sameDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SAME_DAY_DELIVERY. * nextDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * customFulfillment1.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_1. * customFulfillment2.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_2. * customFulfillment3.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_3. * customFulfillment4.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_4. * customFulfillment5.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_5. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+    &quot;A String&quot;,
+  ],
+  &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response message for SearchService.Search method.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # A unique search token. This should be included in the UserEvent logs resulting from this search, which enables accurate attribution of search model performance.
+  &quot;correctedQuery&quot;: &quot;A String&quot;, # If spell correction applies, the corrected query. Otherwise, empty.
+  &quot;facets&quot;: [ # Results of facets requested by user.
+    { # A facet result.
+      &quot;dynamicFacet&quot;: True or False, # Whether the facet is dynamically generated.
+      &quot;key&quot;: &quot;A String&quot;, # The key for this facet. E.g., &quot;colorFamilies&quot; or &quot;price&quot; or &quot;attributes.attr1&quot;.
+      &quot;values&quot;: [ # The facet values for this field.
+        { # A facet value which contains value names and their count.
+          &quot;count&quot;: &quot;A String&quot;, # Number of items that have this facet value.
+          &quot;interval&quot;: { # A floating point interval. # Interval value for a facet, such as [10, 20) for facet &quot;price&quot;.
+            &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+            &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+            &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+            &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+          },
+          &quot;value&quot;: &quot;A String&quot;, # Text value of a facet, such as &quot;Black&quot; for facet &quot;colorFamilies&quot;.
+        },
+      ],
+    },
+  ],
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # A token that can be sent as SearchRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.
+  &quot;queryExpansionInfo&quot;: { # Information describing query expansion including whether expansion has occurred. # Query expansion information for the returned results.
+    &quot;expandedQuery&quot;: True or False, # Bool describing whether query expansion has occurred.
+  },
+  &quot;redirectUri&quot;: &quot;A String&quot;, # The URI of a customer-defined redirect page. If redirect action is triggered, no search will be performed, and only redirect_uri and attribution_token will be set in the response.
+  &quot;results&quot;: [ # A list of matched items. The order represents the ranking.
+    { # Represents the search results.
+      &quot;id&quot;: &quot;A String&quot;, # Product.id of the searched Product.
+      &quot;matchingVariantCount&quot;: 42, # The count of matched variant Products.
+      &quot;matchingVariantFields&quot;: { # If a variant Product matches the search query, this map indicates which Product fields are matched. The key is the Product.name, the value is a field mask of the matched Product fields. If matched attributes cannot be determined, this map will be empty. For example, a key &quot;sku1&quot; with field mask &quot;products.color_info&quot; indicates there is a match between &quot;sku1&quot; ColorInfo and the query.
+        &quot;a_key&quot;: &quot;A String&quot;,
+      },
+      &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # The product data snippet in the search response. Only Product.name is guaranteed to be populated. Product.variants contains the product variants that match the search query. If there are multiple product variants matching the query, top 5 most relevant product variants are returned and ordered by relevancy. If relevancy can be deternmined, use matching_variant_fields to look up matched product variants fields. If relevancy cannot be determined, e.g. when searching &quot;shoe&quot; all products in a shoe product can be a match, 5 product variants are returned but order is meaningless.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
+          &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
+            &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+              3.14,
+            ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
+            &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+          },
+        },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
+        &quot;availableQuantity&quot;: 42, # The available quantity of the item.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
+        &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
+          &quot;A String&quot;,
+        ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
+        &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
+        &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
+        &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+          { # Product thumbnail/detail image.
+            &quot;height&quot;: 42, # Height of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+            &quot;uri&quot;: &quot;A String&quot;, # Required. URI of the image. This field must be a valid UTF-8 encoded URI with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
+            &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
+        &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
+        &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
+          &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
+          &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
+          &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
+        },
+        &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
+        &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
+          &quot;A String&quot;,
+        ],
+        &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
+        &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
+        &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2betaProduct
+        ],
+      },
+      &quot;variantRollupValues&quot;: { # The rollup matching variant Product attributes. The key is one of the SearchRequest.variant_rollup_keys. The values are the merged and de-duplicated Product attributes. Notice that the rollup values are respect filter. For example, when filtering by &quot;colorFamilies:ANY(\&quot;red\&quot;)&quot; and rollup &quot;colorFamilies&quot;, only &quot;red&quot; is returned. For textual and numerical attributes, the rollup values is a list of string or double values with type google.protobuf.ListValue. For example, if there are two variants with colors &quot;red&quot; and &quot;blue&quot;, the rollup values are { key: &quot;colorFamilies&quot; value { list_value { values { string_value: &quot;red&quot; } values { string_value: &quot;blue&quot; } } } } For Product.fulfillment_info, the rollup values is a double value with type google.protobuf.Value. For example, {key: &quot;pickupInStore.store1&quot; value { number_value: 10 }} means a there are 10 variants in this product are available in the store &quot;store1&quot;.
+        &quot;a_key&quot;: &quot;&quot;,
+      },
+    },
+  ],
+  &quot;totalSize&quot;: 42, # The estimated total count of matched items irrespective of pagination. The count of results returned by pagination may be less than the total_size that matches.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="search_next">search_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>
+
 </body></html>
\ No newline at end of file
diff --git a/docs/dyn/retail_v2beta.projects.locations.catalogs.userEvents.html b/docs/dyn/retail_v2beta.projects.locations.catalogs.userEvents.html
index f6dd7d8..9374ea6 100644
--- a/docs/dyn/retail_v2beta.projects.locations.catalogs.userEvents.html
+++ b/docs/dyn/retail_v2beta.projects.locations.catalogs.userEvents.html
@@ -141,14 +141,19 @@
   },
   &quot;inputConfig&quot;: { # The input config source for user events. # Required. The desired input location of the data.
     &quot;bigQuerySource&quot;: { # BigQuery source import data from. # Required. BigQuery input source.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;datasetId&quot;: &quot;A String&quot;, # Required. The BigQuery data set to copy the data from with a length limit of 1,024 characters.
       &quot;gcsStagingDir&quot;: &quot;A String&quot;, # Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.
+      &quot;partitionDate&quot;: { # Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`. # BigQuery time partitioned table&#x27;s _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.
+        &quot;day&quot;: 42, # Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn&#x27;t significant.
+        &quot;month&quot;: 42, # Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.
+        &quot;year&quot;: 42, # Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.
+      },
       &quot;projectId&quot;: &quot;A String&quot;, # The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.
       &quot;tableId&quot;: &quot;A String&quot;, # Required. The BigQuery table to copy the data from with a length limit of 1,024 characters.
     },
     &quot;gcsSource&quot;: { # Google Cloud Storage location for input content. format. # Required. Google Cloud Storage location for the input content.
-      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.
+      &quot;dataSchema&quot;: &quot;A String&quot;, # The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.
       &quot;inputUris&quot;: [ # Required. Google Cloud Storage URIs to input files. URI can be up to 2000 characters long. URIs can match the full object path (for example, `gs://bucket/directory/object.json`) or a pattern matching one or more files, such as `gs://bucket/directory/*.json`. A request can contain at most 100 files, and each file can be up to 2 GB. See [Importing product information](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog) for the expected file format and setup instructions.
         &quot;A String&quot;,
       ],
@@ -158,21 +163,31 @@
         { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
           &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
             &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+              &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
               &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 3.14,
               ],
+              &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
               &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                 &quot;A String&quot;,
               ],
             },
           },
-          &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+          &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
           &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+          &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+            &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+            &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+            &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+          },
           &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
           &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
           &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
             &quot;A String&quot;,
           ],
+          &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
           &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
             &quot;A String&quot;,
           ],
@@ -180,23 +195,60 @@
           &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
             { # Detailed product information associated with a user event.
               &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-                &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+                &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
                   &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+                    &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
                     &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                       3.14,
                     ],
+                    &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
                     &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
                       &quot;A String&quot;,
                     ],
                   },
                 },
+                &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+                  &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+                    &quot;A String&quot;,
+                  ],
+                  &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+                    &quot;A String&quot;,
+                  ],
+                },
                 &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
                 &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-                &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+                &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+                &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+                  &quot;A String&quot;,
+                ],
                 &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
                   &quot;A String&quot;,
                 ],
+                &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+                  &quot;A String&quot;,
+                ],
+                &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                  &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                    &quot;A String&quot;,
+                  ],
+                  &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+                    &quot;A String&quot;,
+                  ],
+                },
+                &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+                  &quot;A String&quot;,
+                ],
                 &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+                &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+                &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+                  { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+                    &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+                      &quot;A String&quot;,
+                    ],
+                    &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+                  },
+                ],
+                &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
                 &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
                 &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
                   { # Product thumbnail/detail image.
@@ -205,20 +257,64 @@
                     &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
                   },
                 ],
+                &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+                &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+                  &quot;A String&quot;,
+                ],
                 &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+                &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+                  &quot;A String&quot;,
+                ],
                 &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
                   &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-                  &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+                  &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
                   &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
                   &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+                  &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+                  &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+                  &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+                    &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+                      &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                      &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                      &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                      &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+                    },
+                    &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+                      &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+                      &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+                      &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+                      &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+                    },
+                  },
                 },
                 &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+                &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+                  { # Promotion information.
+                    &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+                  },
+                ],
+                &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+                &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+                  &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+                  &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+                  &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+                    42,
+                  ],
+                },
+                &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+                &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+                  &quot;A String&quot;,
+                ],
                 &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
                   &quot;A String&quot;,
                 ],
                 &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+                &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
                 &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
                 &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+                &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+                  # Object with schema name: GoogleCloudRetailV2betaProduct
+                ],
               },
               &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
             },
@@ -231,12 +327,13 @@
             &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
           },
           &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-          &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
           &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
           &quot;userInfo&quot;: { # Information of an end user. # User information.
             &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-            &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-            &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+            &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+            &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
             &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
           },
           &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -372,21 +469,31 @@
 { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
   &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
-  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
   &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+  &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+    &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+    &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+    &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+  },
   &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
   &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
   &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
     &quot;A String&quot;,
   ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
   &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;A String&quot;,
   ],
@@ -394,23 +501,60 @@
   &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
     { # Detailed product information associated with a user event.
       &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
           &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
             &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               3.14,
             ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
             &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               &quot;A String&quot;,
             ],
           },
         },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
         &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
         &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
         &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
           &quot;A String&quot;,
         ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
         &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
         &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
         &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
           { # Product thumbnail/detail image.
@@ -419,20 +563,64 @@
             &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
           },
         ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
         &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
         &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
           &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
           &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
           &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
         },
         &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
         &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
           &quot;A String&quot;,
         ],
         &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
         &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
         &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2betaProduct
+        ],
       },
       &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
     },
@@ -445,12 +633,13 @@
     &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
   },
   &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
   &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
   &quot;userInfo&quot;: { # Information of an end user. # User information.
     &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
     &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
   },
   &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
@@ -467,21 +656,31 @@
     { # UserEvent captures all metadata information Retail API needs to know about how end users interact with customers&#x27; website.
   &quot;attributes&quot;: { # Extra user event features to include in the recommendation model. The key must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. For product recommendation, an example of extra user information is traffic_channel, i.e. how user arrives at the site. Users can arrive at the site by coming to the site directly, or coming through Google search, and etc.
     &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+      &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
       &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         3.14,
       ],
+      &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
       &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
         &quot;A String&quot;,
       ],
     },
   },
-  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
+  &quot;attributionToken&quot;: &quot;A String&quot;, # Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K&#x27;s page. When recording events on product K&#x27;s page, log the PredictResponse.attribution_token to this field.
   &quot;cartId&quot;: &quot;A String&quot;, # The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.
+  &quot;completionDetail&quot;: { # Detailed completion information including completion attribution token and clicked completion info. # The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion.
+    &quot;completionAttributionToken&quot;: &quot;A String&quot;, # Completion attribution token in CompleteQueryResponse.attribution_token.
+    &quot;selectedPosition&quot;: 42, # End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.
+    &quot;selectedSuggestion&quot;: &quot;A String&quot;, # End user selected CompleteQueryResponse.CompletionResult.suggestion.
+  },
   &quot;eventTime&quot;: &quot;A String&quot;, # Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.
   &quot;eventType&quot;: &quot;A String&quot;, # Required. User event type. Allowed values are: * `add-to-cart`: Products being added to cart. * `category-page-view`: Special pages such as sale or promotion pages viewed. * `completion`: Completion query result showed/clicked. * `detail-page-view`: Products detail page viewed. * `home-page-view`: Homepage viewed. * `promotion-offered`: Promotion is offered to a user. * `promotion-not-offered`: Promotion is not offered to a user. * `purchase-complete`: User finishing a purchase. * `search`: Product search. * `shopping-cart-page-view`: User viewing a shopping cart.
   &quot;experimentIds&quot;: [ # A list of identifiers for the independent experiment groups this user event belongs to. This is used to distinguish between user events associated with different experiment setups (e.g. using Retail API, using different recommendation models).
     &quot;A String&quot;,
   ],
+  &quot;filter&quot;: &quot;A String&quot;, # The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;offset&quot;: 42, # An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;orderBy&quot;: &quot;A String&quot;, # The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
   &quot;pageCategories&quot;: [ # The categories associated with a category page. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: &quot;pageCategories&quot; : [&quot;Sales &gt; 2017 Black Friday Deals&quot;]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
     &quot;A String&quot;,
   ],
@@ -489,23 +688,60 @@
   &quot;productDetails&quot;: [ # The main product details related to the event. This field is required for the following event types: * `add-to-cart` * `detail-page-view` * `purchase-complete` In a `search` event, this field represents the products returned to the end user on the current page (the end user may have not finished broswing the whole page yet). When a new page is returned to the end user, after pagination/filtering/ordering even for the same query, a new `search` event with different product_details is desired. The end user may have not finished broswing the whole page yet.
     { # Detailed product information associated with a user event.
       &quot;product&quot;: { # Product captures all metadata information of items to be recommended or searched. # Required. Product information. Only Product.id field is used when ingesting an event, all other product fields are ignored as we will look them up from the catalog.
-        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.
+        &quot;attributes&quot;: { # Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ &quot;vendor&quot;: {&quot;text&quot;: [&quot;vendor123&quot;, &quot;vendor456&quot;]}, &quot;lengths_cm&quot;: {&quot;numbers&quot;:[2.3, 15.4]}, &quot;heights_cm&quot;: {&quot;numbers&quot;:[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.
           &quot;a_key&quot;: { # A custom attribute that is not explicitly modeled in Product.
+            &quot;indexable&quot;: True or False, # If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.
             &quot;numbers&quot;: [ # The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is &quot;lengths_cm&quot;. At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               3.14,
             ],
+            &quot;searchable&quot;: True or False, # If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.
             &quot;text&quot;: [ # The textual values of this custom attribute. For example, `[&quot;yellow&quot;, &quot;green&quot;]` when the key is &quot;color&quot;. At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.
               &quot;A String&quot;,
             ],
           },
         },
+        &quot;audience&quot;: { # An intended audience of the Product for whom it&#x27;s sold. # The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product.
+          &quot;ageGroups&quot;: [ # The age groups of the audience. Strongly encouraged to use the standard values: &quot;newborn&quot; (up to 3 months old), &quot;infant&quot; (3–12 months old), &quot;toddler&quot; (1–5 years old), &quot;kids&quot; (5–13 years old), &quot;adult&quot; (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).
+            &quot;A String&quot;,
+          ],
+          &quot;genders&quot;: [ # The genders of the audience. Strongly encouraged to use the standard values: &quot;male&quot;, &quot;female&quot;, &quot;unisex&quot;. At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).
+            &quot;A String&quot;,
+          ],
+        },
         &quot;availability&quot;: &quot;A String&quot;, # The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).
         &quot;availableQuantity&quot;: 42, # The available quantity of the item.
-        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for recommendation.
+        &quot;availableTime&quot;: &quot;A String&quot;, # The timestamp when this Product becomes available for SearchService.Search.
+        &quot;brands&quot;: [ # The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).
+          &quot;A String&quot;,
+        ],
         &quot;categories&quot;: [ # Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use &#x27;&gt;&#x27; sign to separate different hierarchies. If &#x27;&gt;&#x27; is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [&quot;Shoes &amp; Accessories&quot; -&gt; &quot;Shoes&quot;] and [&quot;Sports &amp; Fitness&quot; -&gt; &quot;Athletic Clothing&quot; -&gt; &quot;Shoes&quot;], it could be represented as: &quot;categories&quot;: [ &quot;Shoes &amp; Accessories &gt; Shoes&quot;, &quot;Sports &amp; Fitness &gt; Athletic Clothing &gt; Shoes&quot; ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436
           &quot;A String&quot;,
         ],
+        &quot;collectionMemberIds&quot;: [ # The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.
+          &quot;A String&quot;,
+        ],
+        &quot;colorInfo&quot;: { # The color information of a Product. # The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+          &quot;colorFamilies&quot;: [ # The standard color families. Strongly recommended to use the following standard color groups: &quot;Red&quot;, &quot;Pink&quot;, &quot;Orange&quot;, &quot;Yellow&quot;, &quot;Purple&quot;, &quot;Green&quot;, &quot;Cyan&quot;, &quot;Blue&quot;, &quot;Brown&quot;, &quot;White&quot;, &quot;Gray&quot;, &quot;Black&quot; and &quot;Mixed&quot;. Normally it is expected to have only 1 color family. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+          &quot;colors&quot;: [ # The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single &quot;Mixed&quot; instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;conditions&quot;: [ # The condition of the product. Strongly encouraged to use the standard values: &quot;new&quot;, &quot;refurbished&quot;, &quot;used&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).
+          &quot;A String&quot;,
+        ],
         &quot;description&quot;: &quot;A String&quot;, # Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).
+        &quot;expireTime&quot;: &quot;A String&quot;, # The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).
+        &quot;fulfillmentInfo&quot;: [ # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.
+          { # Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.
+            &quot;placeIds&quot;: [ # The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as &quot;store1&quot; or &quot;REGION-2&quot;. Otherwise, an INVALID_ARGUMENT error is returned.
+              &quot;A String&quot;,
+            ],
+            &quot;type&quot;: &quot;A String&quot;, # The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * &quot;pickup-in-store&quot; * &quot;ship-to-store&quot; * &quot;same-day-delivery&quot; * &quot;next-day-delivery&quot; * &quot;custom-type-1&quot; * &quot;custom-type-2&quot; * &quot;custom-type-3&quot; * &quot;custom-type-4&quot; * &quot;custom-type-5&quot; If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.
+          },
+        ],
+        &quot;gtin&quot;: &quot;A String&quot;, # The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.
         &quot;id&quot;: &quot;A String&quot;, # Immutable. Product identifier, which is the final component of name. For example, this field is &quot;id_1&quot;, if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).
         &quot;images&quot;: [ # Product images for the product.Highly recommended to put the main image to the first. A maximum of 300 images are allowed. Google Merchant Center property [image_link](https://support.google.com/merchants/answer/6324350). Schema.org property [Product.image](https://schema.org/image).
           { # Product thumbnail/detail image.
@@ -514,20 +750,64 @@
             &quot;width&quot;: 42, # Width of the image in number of pixels. This field must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
           },
         ],
+        &quot;languageCode&quot;: &quot;A String&quot;, # Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to &quot;en-US&quot; if unset.
+        &quot;materials&quot;: [ # The material of the product. For example, &quot;leather&quot;, &quot;wooden&quot;. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).
+          &quot;A String&quot;,
+        ],
         &quot;name&quot;: &quot;A String&quot;, # Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be &quot;default_branch&quot;.
+        &quot;patterns&quot;: [ # The pattern or graphic print of the product. For example, &quot;striped&quot;, &quot;polka dot&quot;, &quot;paisley&quot;. A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).
+          &quot;A String&quot;,
+        ],
         &quot;priceInfo&quot;: { # The price information of a Product. # Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371).
           &quot;cost&quot;: 3.14, # The costs associated with the sale of a particular product. Used for gross profit reporting. * Profit = price - cost Google Merchant Center property [cost_of_goods_sold](https://support.google.com/merchants/answer/9017895).
-          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.
+          &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.
           &quot;originalPrice&quot;: 3.14, # Price of the product without any discount. If zero, by default set to be the price.
           &quot;price&quot;: 3.14, # Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).
+          &quot;priceEffectiveTime&quot;: &quot;A String&quot;, # The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceExpireTime&quot;: &quot;A String&quot;, # The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.
+          &quot;priceRange&quot;: { # The price range of all variant Product having the same Product.primary_product_id. # Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+            &quot;originalPrice&quot;: { # A floating point interval. # The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+            &quot;price&quot;: { # A floating point interval. # The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id.
+              &quot;exclusiveMaximum&quot;: 3.14, # Exclusive upper bound.
+              &quot;exclusiveMinimum&quot;: 3.14, # Exclusive lower bound.
+              &quot;maximum&quot;: 3.14, # Inclusive upper bound.
+              &quot;minimum&quot;: 3.14, # Inclusive lower bound.
+            },
+          },
         },
         &quot;primaryProductId&quot;: &quot;A String&quot;, # Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).
+        &quot;promotions&quot;: [ # The promotions applied to the product. A maximum of 10 values are allowed per Product.
+          { # Promotion information.
+            &quot;promotionId&quot;: &quot;A String&quot;, # ID of the promotion. For example, &quot;free gift&quot;. The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).
+          },
+        ],
+        &quot;publishTime&quot;: &quot;A String&quot;, # The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.
+        &quot;rating&quot;: { # The rating of a Product. # The rating of this product.
+          &quot;averageRating&quot;: 3.14, # The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingCount&quot;: 42, # The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.
+          &quot;ratingHistogram&quot;: [ # List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.
+            42,
+          ],
+        },
+        &quot;retrievableFields&quot;: &quot;A String&quot;, # Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form &quot;attributes.key&quot; where &quot;key&quot; is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.
+        &quot;sizes&quot;: [ # The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in &quot;US:MENS:M&quot;, &quot;US&quot; represents size system; &quot;MENS&quot; represents size type; &quot;M&quot; represents size value. In &quot;GIRLS:27&quot;, size system is empty; &quot;GIRLS&quot; represents size type; &quot;27&quot; represents size value. In &quot;32 inches&quot;, both size system and size type are empty, while size value is &quot;32 inches&quot;. A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).
+          &quot;A String&quot;,
+        ],
         &quot;tags&quot;: [ # Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0–4](https://support.google.com/merchants/answer/6324473).
           &quot;A String&quot;,
         ],
         &quot;title&quot;: &quot;A String&quot;, # Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).
+        &quot;ttl&quot;: &quot;A String&quot;, # Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.
         &quot;type&quot;: &quot;A String&quot;, # Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.
         &quot;uri&quot;: &quot;A String&quot;, # Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).
+        &quot;variants&quot;: [ # Output only. Product variants grouped together on primary product which share similar product attributes. It&#x27;s automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.
+          # Object with schema name: GoogleCloudRetailV2betaProduct
+        ],
       },
       &quot;quantity&quot;: 42, # Quantity of the product associated with the user event. For example, this field will be 2 if two products are added to the shopping cart for `purchase-complete` event. Required for `add-to-cart` and `purchase-complete` event types.
     },
@@ -540,12 +820,13 @@
     &quot;tax&quot;: 3.14, # All the taxes associated with the transaction.
   },
   &quot;referrerUri&quot;: &quot;A String&quot;, # The referrer URL of the current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically.
-  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;searchQuery&quot;: &quot;A String&quot;, # The user&#x27;s search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.
+  &quot;sessionId&quot;: &quot;A String&quot;, # A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.
   &quot;uri&quot;: &quot;A String&quot;, # Complete URL (window.location.href) of the user&#x27;s current page. When using the client side event reporting with JavaScript pixel and Google Tag Manager, this value is filled in automatically. Maximum length 5,000 characters.
   &quot;userInfo&quot;: { # Information of an end user. # User information.
     &quot;directUserRequest&quot;: True or False, # True if the request is made directly from the end user, in which case the ip_address and user_agent can be populated from the HTTP request. This flag should be set only if the API request is made directly from the end user such as a mobile app (and not if a gateway or a server is processing and pushing the user events). This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent.
-    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
-    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;ipAddress&quot;: &quot;A String&quot;, # The end user&#x27;s IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. &quot;104.133.9.80&quot;) or an IPv6 address (e.g. &quot;2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
+    &quot;userAgent&quot;: &quot;A String&quot;, # User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.
     &quot;userId&quot;: &quot;A String&quot;, # Highly recommended for logged-in users. Unique identifier for logged-in user, such as a user name. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.
   },
   &quot;visitorId&quot;: &quot;A String&quot;, # Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor log in/out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. The field should not contain PII or user-data. We recommend to use Google Analystics [Client ID](https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId) for this field.
diff --git a/docs/dyn/run_v1.namespaces.configurations.html b/docs/dyn/run_v1.namespaces.configurations.html
index c405905..8604930 100644
--- a/docs/dyn/run_v1.namespaces.configurations.html
+++ b/docs/dyn/run_v1.namespaces.configurations.html
@@ -173,7 +173,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -398,11 +398,11 @@
 
 Args:
   parent: string, The namespace from which the configurations should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -486,7 +486,7 @@
             &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
           },
           &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-            &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+            &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
             &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
               { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
                 &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
diff --git a/docs/dyn/run_v1.namespaces.domainmappings.html b/docs/dyn/run_v1.namespaces.domainmappings.html
index 85f0c0a..68187a0 100644
--- a/docs/dyn/run_v1.namespaces.domainmappings.html
+++ b/docs/dyn/run_v1.namespaces.domainmappings.html
@@ -164,7 +164,7 @@
         &quot;type&quot;: &quot;A String&quot;, # Resource record type. Example: `AAAA`.
       },
     ],
-    &quot;url&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional
+    &quot;url&quot;: &quot;A String&quot;, # Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.
   },
 }
 
@@ -237,7 +237,7 @@
         &quot;type&quot;: &quot;A String&quot;, # Resource record type. Example: `AAAA`.
       },
     ],
-    &quot;url&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional
+    &quot;url&quot;: &quot;A String&quot;, # Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.
   },
 }</pre>
 </div>
@@ -361,7 +361,7 @@
         &quot;type&quot;: &quot;A String&quot;, # Resource record type. Example: `AAAA`.
       },
     ],
-    &quot;url&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional
+    &quot;url&quot;: &quot;A String&quot;, # Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.
   },
 }</pre>
 </div>
@@ -372,11 +372,11 @@
 
 Args:
   parent: string, The namespace from which the domain mappings should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -450,7 +450,7 @@
             &quot;type&quot;: &quot;A String&quot;, # Resource record type. Example: `AAAA`.
           },
         ],
-        &quot;url&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional
+        &quot;url&quot;: &quot;A String&quot;, # Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.
       },
     },
   ],
diff --git a/docs/dyn/run_v1.namespaces.revisions.html b/docs/dyn/run_v1.namespaces.revisions.html
index b551af3..57c6c05 100644
--- a/docs/dyn/run_v1.namespaces.revisions.html
+++ b/docs/dyn/run_v1.namespaces.revisions.html
@@ -187,7 +187,7 @@
     &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
   },
   &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # Spec holds the desired state of the Revision (from the client).
-    &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+    &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
     &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
       { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
         &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -398,7 +398,7 @@
       },
     ],
     &quot;imageDigest&quot;: &quot;A String&quot;, # ImageDigest holds the resolved digest for the image specified within .Spec.Container.Image. The digest is resolved during the creation of Revision. This field holds the digest value regardless of whether a tag or digest was originally specified in the Container object.
-    &quot;logUrl&quot;: &quot;A String&quot;, # Specifies the generated logging url for this particular revision based on the revision url template specified in the controller&#x27;s config. +optional
+    &quot;logUrl&quot;: &quot;A String&quot;, # Optional. Specifies the generated logging url for this particular revision based on the revision url template specified in the controller&#x27;s config.
     &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Revision that was last processed by the controller. Clients polling for completed reconciliation should poll until observedGeneration = metadata.generation, and the Ready condition&#x27;s status is True or False.
     &quot;serviceName&quot;: &quot;A String&quot;, # Not currently used by Cloud Run.
   },
@@ -411,11 +411,11 @@
 
 Args:
   parent: string, The namespace from which the revisions should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -465,7 +465,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # Spec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -676,7 +676,7 @@
           },
         ],
         &quot;imageDigest&quot;: &quot;A String&quot;, # ImageDigest holds the resolved digest for the image specified within .Spec.Container.Image. The digest is resolved during the creation of Revision. This field holds the digest value regardless of whether a tag or digest was originally specified in the Container object.
-        &quot;logUrl&quot;: &quot;A String&quot;, # Specifies the generated logging url for this particular revision based on the revision url template specified in the controller&#x27;s config. +optional
+        &quot;logUrl&quot;: &quot;A String&quot;, # Optional. Specifies the generated logging url for this particular revision based on the revision url template specified in the controller&#x27;s config.
         &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Revision that was last processed by the controller. Clients polling for completed reconciliation should poll until observedGeneration = metadata.generation, and the Ready condition&#x27;s status is True or False.
         &quot;serviceName&quot;: &quot;A String&quot;, # Not currently used by Cloud Run.
       },
diff --git a/docs/dyn/run_v1.namespaces.routes.html b/docs/dyn/run_v1.namespaces.routes.html
index 4f89da5..2fdb6ad 100644
--- a/docs/dyn/run_v1.namespaces.routes.html
+++ b/docs/dyn/run_v1.namespaces.routes.html
@@ -142,10 +142,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations. Cloud Run currently supports a single configurationName.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -168,10 +168,10 @@
     &quot;traffic&quot;: [ # Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -186,11 +186,11 @@
 
 Args:
   parent: string, The namespace from which the routes should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -243,10 +243,10 @@
         &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations. Cloud Run currently supports a single configurationName.
           { # TrafficTarget holds a single entry of the routing table for a Route.
             &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-            &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+            &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
             &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
             &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-            &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+            &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
             &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
           },
         ],
@@ -269,10 +269,10 @@
         &quot;traffic&quot;: [ # Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
           { # TrafficTarget holds a single entry of the routing table for a Route.
             &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-            &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+            &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
             &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
             &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-            &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+            &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
             &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
           },
         ],
diff --git a/docs/dyn/run_v1.namespaces.services.html b/docs/dyn/run_v1.namespaces.services.html
index fac7856..c3f1735 100644
--- a/docs/dyn/run_v1.namespaces.services.html
+++ b/docs/dyn/run_v1.namespaces.services.html
@@ -177,7 +177,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -380,10 +380,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -408,10 +408,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -498,7 +498,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -701,10 +701,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -729,10 +729,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -870,7 +870,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -1073,10 +1073,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -1101,10 +1101,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -1119,11 +1119,11 @@
 
 Args:
   parent: string, The namespace from which the services should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -1207,7 +1207,7 @@
             &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
           },
           &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-            &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+            &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
             &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
               { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
                 &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -1410,10 +1410,10 @@
         &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
           { # TrafficTarget holds a single entry of the routing table for a Route.
             &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-            &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+            &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
             &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
             &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-            &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+            &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
             &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
           },
         ],
@@ -1438,10 +1438,10 @@
         &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
           { # TrafficTarget holds a single entry of the routing table for a Route.
             &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-            &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+            &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
             &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
             &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-            &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+            &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
             &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
           },
         ],
@@ -1540,7 +1540,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -1743,10 +1743,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -1771,10 +1771,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -1861,7 +1861,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -2064,10 +2064,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -2092,10 +2092,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
diff --git a/docs/dyn/run_v1.projects.locations.configurations.html b/docs/dyn/run_v1.projects.locations.configurations.html
index 0d6d9cc..678bcbe 100644
--- a/docs/dyn/run_v1.projects.locations.configurations.html
+++ b/docs/dyn/run_v1.projects.locations.configurations.html
@@ -173,7 +173,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -398,11 +398,11 @@
 
 Args:
   parent: string, The namespace from which the configurations should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -486,7 +486,7 @@
             &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
           },
           &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-            &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+            &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
             &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
               { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
                 &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
diff --git a/docs/dyn/run_v1.projects.locations.domainmappings.html b/docs/dyn/run_v1.projects.locations.domainmappings.html
index 127eb6f..730caa6 100644
--- a/docs/dyn/run_v1.projects.locations.domainmappings.html
+++ b/docs/dyn/run_v1.projects.locations.domainmappings.html
@@ -164,7 +164,7 @@
         &quot;type&quot;: &quot;A String&quot;, # Resource record type. Example: `AAAA`.
       },
     ],
-    &quot;url&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional
+    &quot;url&quot;: &quot;A String&quot;, # Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.
   },
 }
 
@@ -237,7 +237,7 @@
         &quot;type&quot;: &quot;A String&quot;, # Resource record type. Example: `AAAA`.
       },
     ],
-    &quot;url&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional
+    &quot;url&quot;: &quot;A String&quot;, # Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.
   },
 }</pre>
 </div>
@@ -361,7 +361,7 @@
         &quot;type&quot;: &quot;A String&quot;, # Resource record type. Example: `AAAA`.
       },
     ],
-    &quot;url&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional
+    &quot;url&quot;: &quot;A String&quot;, # Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.
   },
 }</pre>
 </div>
@@ -372,11 +372,11 @@
 
 Args:
   parent: string, The namespace from which the domain mappings should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -450,7 +450,7 @@
             &quot;type&quot;: &quot;A String&quot;, # Resource record type. Example: `AAAA`.
           },
         ],
-        &quot;url&quot;: &quot;A String&quot;, # Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional
+        &quot;url&quot;: &quot;A String&quot;, # Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.
       },
     },
   ],
diff --git a/docs/dyn/run_v1.projects.locations.revisions.html b/docs/dyn/run_v1.projects.locations.revisions.html
index 262af1e..9364a2a 100644
--- a/docs/dyn/run_v1.projects.locations.revisions.html
+++ b/docs/dyn/run_v1.projects.locations.revisions.html
@@ -187,7 +187,7 @@
     &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
   },
   &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # Spec holds the desired state of the Revision (from the client).
-    &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+    &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
     &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
       { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
         &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -398,7 +398,7 @@
       },
     ],
     &quot;imageDigest&quot;: &quot;A String&quot;, # ImageDigest holds the resolved digest for the image specified within .Spec.Container.Image. The digest is resolved during the creation of Revision. This field holds the digest value regardless of whether a tag or digest was originally specified in the Container object.
-    &quot;logUrl&quot;: &quot;A String&quot;, # Specifies the generated logging url for this particular revision based on the revision url template specified in the controller&#x27;s config. +optional
+    &quot;logUrl&quot;: &quot;A String&quot;, # Optional. Specifies the generated logging url for this particular revision based on the revision url template specified in the controller&#x27;s config.
     &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Revision that was last processed by the controller. Clients polling for completed reconciliation should poll until observedGeneration = metadata.generation, and the Ready condition&#x27;s status is True or False.
     &quot;serviceName&quot;: &quot;A String&quot;, # Not currently used by Cloud Run.
   },
@@ -411,11 +411,11 @@
 
 Args:
   parent: string, The namespace from which the revisions should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -465,7 +465,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # Spec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -676,7 +676,7 @@
           },
         ],
         &quot;imageDigest&quot;: &quot;A String&quot;, # ImageDigest holds the resolved digest for the image specified within .Spec.Container.Image. The digest is resolved during the creation of Revision. This field holds the digest value regardless of whether a tag or digest was originally specified in the Container object.
-        &quot;logUrl&quot;: &quot;A String&quot;, # Specifies the generated logging url for this particular revision based on the revision url template specified in the controller&#x27;s config. +optional
+        &quot;logUrl&quot;: &quot;A String&quot;, # Optional. Specifies the generated logging url for this particular revision based on the revision url template specified in the controller&#x27;s config.
         &quot;observedGeneration&quot;: 42, # ObservedGeneration is the &#x27;Generation&#x27; of the Revision that was last processed by the controller. Clients polling for completed reconciliation should poll until observedGeneration = metadata.generation, and the Ready condition&#x27;s status is True or False.
         &quot;serviceName&quot;: &quot;A String&quot;, # Not currently used by Cloud Run.
       },
diff --git a/docs/dyn/run_v1.projects.locations.routes.html b/docs/dyn/run_v1.projects.locations.routes.html
index 782ded0..7488d3d 100644
--- a/docs/dyn/run_v1.projects.locations.routes.html
+++ b/docs/dyn/run_v1.projects.locations.routes.html
@@ -142,10 +142,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations. Cloud Run currently supports a single configurationName.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -168,10 +168,10 @@
     &quot;traffic&quot;: [ # Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -186,11 +186,11 @@
 
 Args:
   parent: string, The namespace from which the routes should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -243,10 +243,10 @@
         &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations. Cloud Run currently supports a single configurationName.
           { # TrafficTarget holds a single entry of the routing table for a Route.
             &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-            &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+            &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
             &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
             &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-            &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+            &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
             &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
           },
         ],
@@ -269,10 +269,10 @@
         &quot;traffic&quot;: [ # Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
           { # TrafficTarget holds a single entry of the routing table for a Route.
             &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-            &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+            &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
             &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
             &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-            &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+            &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
             &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
           },
         ],
diff --git a/docs/dyn/run_v1.projects.locations.services.html b/docs/dyn/run_v1.projects.locations.services.html
index 078d50c..fd6830f 100644
--- a/docs/dyn/run_v1.projects.locations.services.html
+++ b/docs/dyn/run_v1.projects.locations.services.html
@@ -186,7 +186,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -389,10 +389,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -417,10 +417,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -507,7 +507,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -710,10 +710,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -738,10 +738,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -879,7 +879,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -1082,10 +1082,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -1110,10 +1110,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -1176,11 +1176,11 @@
 
 Args:
   parent: string, The namespace from which the services should be listed. For Cloud Run (fully managed), replace {namespace_id} with the project ID or number. (required)
-  continue: string, Optional encoded string to continue paging.
+  continue: string, Optional. Encoded string to continue paging.
   fieldSelector: string, Allows to filter resources based on a specific value for a field name. Send this in a query string format. i.e. &#x27;metadata.name%3Dlorem&#x27;. Not currently used by Cloud Run.
   includeUninitialized: boolean, Not currently used by Cloud Run.
   labelSelector: string, Allows to filter resources based on a label. Supported operations are =, !=, exists, in, and notIn.
-  limit: integer, The maximum number of records that should be returned.
+  limit: integer, Optional. The maximum number of records that should be returned.
   resourceVersion: string, The baseline resource version from which the list or watch operation should start. Not currently used by Cloud Run.
   watch: boolean, Flag that indicates that the client expects to watch this resource as well. Not currently used by Cloud Run.
   x__xgafv: string, V1 error format.
@@ -1264,7 +1264,7 @@
             &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
           },
           &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-            &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+            &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
             &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
               { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
                 &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -1467,10 +1467,10 @@
         &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
           { # TrafficTarget holds a single entry of the routing table for a Route.
             &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-            &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+            &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
             &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
             &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-            &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+            &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
             &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
           },
         ],
@@ -1495,10 +1495,10 @@
         &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
           { # TrafficTarget holds a single entry of the routing table for a Route.
             &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-            &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+            &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
             &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
             &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-            &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+            &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
             &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
           },
         ],
@@ -1597,7 +1597,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -1800,10 +1800,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -1828,10 +1828,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -1918,7 +1918,7 @@
         &quot;uid&quot;: &quot;A String&quot;, # (Optional) UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
       },
       &quot;spec&quot;: { # RevisionSpec holds the desired state of the Revision (from the client). # RevisionSpec holds the desired state of the Revision (from the client).
-        &quot;containerConcurrency&quot;: 42, # (Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
+        &quot;containerConcurrency&quot;: 42, # Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.
         &quot;containers&quot;: [ # Containers holds the single container that defines the unit of execution for this Revision. In the context of a Revision, we disallow a number of fields on this Container, including: name and lifecycle. In Cloud Run, only a single container may be provided. The runtime contract is documented here: https://github.com/knative/serving/blob/master/docs/runtime-contract.md
           { # A single application container. This specifies both the container to run, the command to run in the container and the arguments to supply to it. Note that additional arguments may be supplied by the system to the container at runtime.
             &quot;args&quot;: [ # (Optional) Arguments to the entrypoint. The docker image&#x27;s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container&#x27;s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell
@@ -2121,10 +2121,10 @@
     &quot;traffic&quot;: [ # Traffic specifies how to distribute traffic over a collection of Knative Revisions and Configurations.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
@@ -2149,10 +2149,10 @@
     &quot;traffic&quot;: [ # From RouteStatus. Traffic holds the configured traffic distribution. These entries will always contain RevisionName references. When ConfigurationName appears in the spec, this will hold the LatestReadyRevisionName that we last observed.
       { # TrafficTarget holds a single entry of the routing table for a Route.
         &quot;configurationName&quot;: &quot;A String&quot;, # ConfigurationName of a configuration to whose latest revision we will send this portion of traffic. When the &quot;status.latestReadyRevisionName&quot; of the referenced configuration changes, we will automatically migrate traffic from the prior &quot;latest ready&quot; revision to the new one. This field is never set in Route&#x27;s status, only its spec. This is mutually exclusive with RevisionName. Cloud Run currently supports a single ConfigurationName.
-        &quot;latestRevision&quot;: True or False, # LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional
+        &quot;latestRevision&quot;: True or False, # Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.
         &quot;percent&quot;: 42, # Percent specifies percent of the traffic to this Revision or Configuration. This defaults to zero if unspecified. Cloud Run currently requires 100 percent for a single ConfigurationName TrafficTarget entry.
         &quot;revisionName&quot;: &quot;A String&quot;, # RevisionName of a specific revision to which to send this portion of traffic. This is mutually exclusive with ConfigurationName. Providing RevisionName in spec is not currently supported by Cloud Run.
-        &quot;tag&quot;: &quot;A String&quot;, # Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional
+        &quot;tag&quot;: &quot;A String&quot;, # Optional. Tag is used to expose a dedicated url for referencing this target exclusively.
         &quot;url&quot;: &quot;A String&quot;, # Output only. URL displays the URL for accessing tagged traffic targets. URL is displayed in status, and is disallowed on spec. URL must contain a scheme (e.g. http://) and a hostname, but may not contain anything else (e.g. basic auth, url path, etc.)
       },
     ],
diff --git a/docs/dyn/securitycenter_v1.folders.sources.findings.html b/docs/dyn/securitycenter_v1.folders.sources.findings.html
index 0708731..0f94527 100644
--- a/docs/dyn/securitycenter_v1.folders.sources.findings.html
+++ b/docs/dyn/securitycenter_v1.folders.sources.findings.html
@@ -189,6 +189,15 @@
         &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
         &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
         &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+        &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+        &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+          &quot;domains&quot;: [ # List of domains associated to the Finding.
+            &quot;A String&quot;,
+          ],
+          &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+            &quot;A String&quot;,
+          ],
+        },
         &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
         &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
         &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -256,6 +265,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -288,6 +306,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -334,6 +361,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
diff --git a/docs/dyn/securitycenter_v1.organizations.sources.findings.html b/docs/dyn/securitycenter_v1.organizations.sources.findings.html
index 51e02f1..f9f7580 100644
--- a/docs/dyn/securitycenter_v1.organizations.sources.findings.html
+++ b/docs/dyn/securitycenter_v1.organizations.sources.findings.html
@@ -122,6 +122,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -154,6 +163,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -257,6 +275,15 @@
         &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
         &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
         &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+        &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+        &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+          &quot;domains&quot;: [ # List of domains associated to the Finding.
+            &quot;A String&quot;,
+          ],
+          &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+            &quot;A String&quot;,
+          ],
+        },
         &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
         &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
         &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -324,6 +351,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -356,6 +392,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -402,6 +447,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
diff --git a/docs/dyn/securitycenter_v1.projects.sources.findings.html b/docs/dyn/securitycenter_v1.projects.sources.findings.html
index 12097c7..d25a8dd 100644
--- a/docs/dyn/securitycenter_v1.projects.sources.findings.html
+++ b/docs/dyn/securitycenter_v1.projects.sources.findings.html
@@ -189,6 +189,15 @@
         &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
         &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
         &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+        &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+        &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+          &quot;domains&quot;: [ # List of domains associated to the Finding.
+            &quot;A String&quot;,
+          ],
+          &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+            &quot;A String&quot;,
+          ],
+        },
         &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
         &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
         &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -256,6 +265,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -288,6 +306,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
@@ -334,6 +361,15 @@
   &quot;createTime&quot;: &quot;A String&quot;, # The time at which the finding was created in Security Command Center.
   &quot;eventTime&quot;: &quot;A String&quot;, # The time at which the event took place, or when an update to the finding occurred. For example, if the finding represents an open firewall it would capture the time the detector believes the firewall became open. The accuracy is determined by the detector. If the finding were to be resolved afterward, this time would reflect when the finding was resolved. Must not be set to a value greater than the current timestamp.
   &quot;externalUri&quot;: &quot;A String&quot;, # The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.
+  &quot;findingClass&quot;: &quot;A String&quot;, # The class of the finding.
+  &quot;indicator&quot;: { # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise # Represents what&#x27;s commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise
+    &quot;domains&quot;: [ # List of domains associated to the Finding.
+      &quot;A String&quot;,
+    ],
+    &quot;ipAddresses&quot;: [ # List of ip addresses associated to the Finding.
+      &quot;A String&quot;,
+    ],
+  },
   &quot;name&quot;: &quot;A String&quot;, # The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: &quot;organizations/{organization_id}/sources/{source_id}/findings/{finding_id}&quot;
   &quot;parent&quot;: &quot;A String&quot;, # The relative resource name of the source the finding belongs to. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name This field is immutable after creation time. For example: &quot;organizations/{organization_id}/sources/{source_id}&quot;
   &quot;resourceName&quot;: &quot;A String&quot;, # For findings on Google Cloud resources, the full resource name of the Google Cloud resource this finding is for. See: https://cloud.google.com/apis/design/resource_names#full_resource_name When the finding is for a non-Google Cloud resource, the resourceName can be a customer or partner defined string. This field is immutable after creation time.
diff --git a/docs/dyn/servicedirectory_v1.projects.locations.namespaces.services.endpoints.html b/docs/dyn/servicedirectory_v1.projects.locations.namespaces.services.endpoints.html
index 0d663c2..a7ef488 100644
--- a/docs/dyn/servicedirectory_v1.projects.locations.namespaces.services.endpoints.html
+++ b/docs/dyn/servicedirectory_v1.projects.locations.namespaces.services.endpoints.html
@@ -112,7 +112,7 @@
 
 { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -130,7 +130,7 @@
 
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -172,7 +172,7 @@
 
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -202,7 +202,7 @@
   &quot;endpoints&quot;: [ # The list of endpoints.
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -238,7 +238,7 @@
 
 { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -256,7 +256,7 @@
 
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
diff --git a/docs/dyn/servicedirectory_v1.projects.locations.namespaces.services.html b/docs/dyn/servicedirectory_v1.projects.locations.namespaces.services.html
index 0bf0efb..0b0943e 100644
--- a/docs/dyn/servicedirectory_v1.projects.locations.namespaces.services.html
+++ b/docs/dyn/servicedirectory_v1.projects.locations.namespaces.services.html
@@ -128,13 +128,13 @@
     The object takes the form of:
 
 { # An individual service. A service contains a name and optional metadata. A service must exist before endpoints can be added to it.
-  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;endpoints&quot;: [ # Output only. Endpoints associated with this service. Returned on LookupService.ResolveService. Control plane clients should use RegistrationService.ListEndpoints.
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -154,13 +154,13 @@
   An object of the form:
 
     { # An individual service. A service contains a name and optional metadata. A service must exist before endpoints can be added to it.
-  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;endpoints&quot;: [ # Output only. Endpoints associated with this service. Returned on LookupService.ResolveService. Control plane clients should use RegistrationService.ListEndpoints.
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -204,13 +204,13 @@
   An object of the form:
 
     { # An individual service. A service contains a name and optional metadata. A service must exist before endpoints can be added to it.
-  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;endpoints&quot;: [ # Output only. Endpoints associated with this service. Returned on LookupService.ResolveService. Control plane clients should use RegistrationService.ListEndpoints.
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -286,13 +286,13 @@
   &quot;nextPageToken&quot;: &quot;A String&quot;, # Token to retrieve the next page of results, or empty if there are no more results in the list.
   &quot;services&quot;: [ # The list of services.
     { # An individual service. A service contains a name and optional metadata. A service must exist before endpoints can be added to it.
-      &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;endpoints&quot;: [ # Output only. Endpoints associated with this service. Returned on LookupService.ResolveService. Control plane clients should use RegistrationService.ListEndpoints.
         { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
           &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-          &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+          &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
             &quot;a_key&quot;: &quot;A String&quot;,
           },
           &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -329,13 +329,13 @@
     The object takes the form of:
 
 { # An individual service. A service contains a name and optional metadata. A service must exist before endpoints can be added to it.
-  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;endpoints&quot;: [ # Output only. Endpoints associated with this service. Returned on LookupService.ResolveService. Control plane clients should use RegistrationService.ListEndpoints.
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -355,13 +355,13 @@
   An object of the form:
 
     { # An individual service. A service contains a name and optional metadata. A service must exist before endpoints can be added to it.
-  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;endpoints&quot;: [ # Output only. Endpoints associated with this service. Returned on LookupService.ResolveService. Control plane clients should use RegistrationService.ListEndpoints.
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -396,13 +396,13 @@
 
     { # The response message for LookupService.ResolveService.
   &quot;service&quot;: { # An individual service. A service contains a name and optional metadata. A service must exist before endpoints can be added to it.
-    &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+    &quot;annotations&quot;: { # Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
       &quot;a_key&quot;: &quot;A String&quot;,
     },
     &quot;endpoints&quot;: [ # Output only. Endpoints associated with this service. Returned on LookupService.ResolveService. Control plane clients should use RegistrationService.ListEndpoints.
       { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
         &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
-        &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
+        &quot;annotations&quot;: { # Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.
           &quot;a_key&quot;: &quot;A String&quot;,
         },
         &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
diff --git a/docs/dyn/servicedirectory_v1beta1.projects.locations.namespaces.services.endpoints.html b/docs/dyn/servicedirectory_v1beta1.projects.locations.namespaces.services.endpoints.html
index b6ee470..0bef8b6 100644
--- a/docs/dyn/servicedirectory_v1beta1.projects.locations.namespaces.services.endpoints.html
+++ b/docs/dyn/servicedirectory_v1beta1.projects.locations.namespaces.services.endpoints.html
@@ -113,7 +113,7 @@
 { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -134,7 +134,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -179,7 +179,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -212,7 +212,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -251,7 +251,7 @@
 { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -272,7 +272,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
   &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
   &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
diff --git a/docs/dyn/servicedirectory_v1beta1.projects.locations.namespaces.services.html b/docs/dyn/servicedirectory_v1beta1.projects.locations.namespaces.services.html
index 693f639..ad9230c 100644
--- a/docs/dyn/servicedirectory_v1beta1.projects.locations.namespaces.services.html
+++ b/docs/dyn/servicedirectory_v1beta1.projects.locations.namespaces.services.html
@@ -133,7 +133,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -142,7 +142,7 @@
       &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was last updated.
     },
   ],
-  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the service in the format `projects/*/locations/*/namespaces/*/services/*`.
@@ -164,7 +164,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -173,7 +173,7 @@
       &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was last updated.
     },
   ],
-  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the service in the format `projects/*/locations/*/namespaces/*/services/*`.
@@ -219,7 +219,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -228,7 +228,7 @@
       &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was last updated.
     },
   ],
-  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the service in the format `projects/*/locations/*/namespaces/*/services/*`.
@@ -306,7 +306,7 @@
         { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
           &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
           &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-          &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+          &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
             &quot;a_key&quot;: &quot;A String&quot;,
           },
           &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -315,7 +315,7 @@
           &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was last updated.
         },
       ],
-      &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the service in the format `projects/*/locations/*/namespaces/*/services/*`.
@@ -354,7 +354,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -363,7 +363,7 @@
       &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was last updated.
     },
   ],
-  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the service in the format `projects/*/locations/*/namespaces/*/services/*`.
@@ -385,7 +385,7 @@
     { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
       &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
       &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+      &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
         &quot;a_key&quot;: &quot;A String&quot;,
       },
       &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -394,7 +394,7 @@
       &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was last updated.
     },
   ],
-  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+  &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
     &quot;a_key&quot;: &quot;A String&quot;,
   },
   &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the service in the format `projects/*/locations/*/namespaces/*/services/*`.
@@ -431,7 +431,7 @@
       { # An individual endpoint that provides a service. The service must already exist to create an endpoint.
         &quot;address&quot;: &quot;A String&quot;, # Optional. An IPv4 or IPv6 address. Service Directory rejects bad addresses like: * `8.8.8` * `8.8.8.8:53` * `test:bad:address` * `[::1]` * `[::1]:8080` Limited to 45 characters.
         &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was created.
-        &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+        &quot;metadata&quot;: { # Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
           &quot;a_key&quot;: &quot;A String&quot;,
         },
         &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the endpoint in the format `projects/*/locations/*/namespaces/*/services/*/endpoints/*`.
@@ -440,7 +440,7 @@
         &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the endpoint was last updated.
       },
     ],
-    &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
+    &quot;metadata&quot;: { # Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.
       &quot;a_key&quot;: &quot;A String&quot;,
     },
     &quot;name&quot;: &quot;A String&quot;, # Immutable. The resource name for the service in the format `projects/*/locations/*/namespaces/*/services/*`.
diff --git a/docs/dyn/slides_v1.presentations.html b/docs/dyn/slides_v1.presentations.html
index d402260..ebad4a7 100644
--- a/docs/dyn/slides_v1.presentations.html
+++ b/docs/dyn/slides_v1.presentations.html
@@ -777,7 +777,1009 @@
           &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
           &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
           &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-          &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
+          &quot;notesPage&quot;: { # A page in a presentation. # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
+            &quot;layoutProperties&quot;: { # The properties of Page are only relevant for pages with page_type LAYOUT. # Layout specific properties. Only set if page_type = LAYOUT.
+              &quot;displayName&quot;: &quot;A String&quot;, # The human-readable name of the layout.
+              &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this layout is based on.
+              &quot;name&quot;: &quot;A String&quot;, # The name of the layout.
+            },
+            &quot;masterProperties&quot;: { # The properties of Page that are only relevant for pages with page_type MASTER. # Master specific properties. Only set if page_type = MASTER.
+              &quot;displayName&quot;: &quot;A String&quot;, # The human-readable name of the master.
+            },
+            &quot;notesProperties&quot;: { # The properties of Page that are only relevant for pages with page_type NOTES. # Notes specific properties. Only set if page_type = NOTES.
+              &quot;speakerNotesObjectId&quot;: &quot;A String&quot;, # The object ID of the shape on this notes page that contains the speaker notes for the corresponding slide. The actual shape may not always exist on the notes page. Inserting text using this object ID will automatically create the shape. In this case, the actual shape may have different object ID. The `GetPresentation` or `GetPage` action will always return the latest object ID.
+            },
+            &quot;objectId&quot;: &quot;A String&quot;, # The object ID for this page. Object IDs used by Page and PageElement share the same namespace.
+            &quot;pageElements&quot;: [ # The page elements rendered on the page.
+              { # A visual element rendered on a page.
+                &quot;description&quot;: &quot;A String&quot;, # The description of the page element. Combined with title to display alt text. The field is not supported for Group elements.
+                &quot;elementGroup&quot;: { # A PageElement kind representing a joined collection of PageElements. # A collection of page elements joined as a single unit.
+                  &quot;children&quot;: [ # The collection of elements in the group. The minimum size of a group is 2.
+                    # Object with schema name: PageElement
+                  ],
+                },
+                &quot;image&quot;: { # A PageElement kind representing an image. # An image page element.
+                  &quot;contentUrl&quot;: &quot;A String&quot;, # An URL to an image with a default lifetime of 30 minutes. This URL is tagged with the account of the requester. Anyone with the URL effectively accesses the image as the original requester. Access to the image may be lost if the presentation&#x27;s sharing settings change.
+                  &quot;imageProperties&quot;: { # The properties of the Image. # The properties of the image.
+                    &quot;brightness&quot;: 3.14, # The brightness effect of the image. The value should be in the interval [-1.0, 1.0], where 0 means no effect. This property is read-only.
+                    &quot;contrast&quot;: 3.14, # The contrast effect of the image. The value should be in the interval [-1.0, 1.0], where 0 means no effect. This property is read-only.
+                    &quot;cropProperties&quot;: { # The crop properties of an object enclosed in a container. For example, an Image. The crop properties is represented by the offsets of four edges which define a crop rectangle. The offsets are measured in percentage from the corresponding edges of the object&#x27;s original bounding rectangle towards inside, relative to the object&#x27;s original dimensions. - If the offset is in the interval (0, 1), the corresponding edge of crop rectangle is positioned inside of the object&#x27;s original bounding rectangle. - If the offset is negative or greater than 1, the corresponding edge of crop rectangle is positioned outside of the object&#x27;s original bounding rectangle. - If the left edge of the crop rectangle is on the right side of its right edge, the object will be flipped horizontally. - If the top edge of the crop rectangle is below its bottom edge, the object will be flipped vertically. - If all offsets and rotation angle is 0, the object is not cropped. After cropping, the content in the crop rectangle will be stretched to fit its container. # The crop properties of the image. If not set, the image is not cropped. This property is read-only.
+                      &quot;angle&quot;: 3.14, # The rotation angle of the crop window around its center, in radians. Rotation angle is applied after the offset.
+                      &quot;bottomOffset&quot;: 3.14, # The offset specifies the bottom edge of the crop rectangle that is located above the original bounding rectangle bottom edge, relative to the object&#x27;s original height.
+                      &quot;leftOffset&quot;: 3.14, # The offset specifies the left edge of the crop rectangle that is located to the right of the original bounding rectangle left edge, relative to the object&#x27;s original width.
+                      &quot;rightOffset&quot;: 3.14, # The offset specifies the right edge of the crop rectangle that is located to the left of the original bounding rectangle right edge, relative to the object&#x27;s original width.
+                      &quot;topOffset&quot;: 3.14, # The offset specifies the top edge of the crop rectangle that is located below the original bounding rectangle top edge, relative to the object&#x27;s original height.
+                    },
+                    &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the image. If unset, there is no link.
+                      &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                      &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                      &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                      &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                    },
+                    &quot;outline&quot;: { # The outline of a PageElement. If these fields are unset, they may be inherited from a parent placeholder if it exists. If there is no parent, the fields will default to the value used for new page elements created in the Slides editor, which may depend on the page element kind. # The outline of the image. If not set, the image has no outline.
+                      &quot;dashStyle&quot;: &quot;A String&quot;, # The dash style of the outline.
+                      &quot;outlineFill&quot;: { # The fill of the outline. # The fill of the outline.
+                        &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid color fill.
+                          &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                          &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                            &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                              &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                              &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                              &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                            },
+                            &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                          },
+                        },
+                      },
+                      &quot;propertyState&quot;: &quot;A String&quot;, # The outline property state. Updating the outline on a page element will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no outline on a page element, set this field to `NOT_RENDERED`. In this case, any other outline fields set in the same request will be ignored.
+                      &quot;weight&quot;: { # A magnitude in a single direction in the specified units. # The thickness of the outline.
+                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                      },
+                    },
+                    &quot;recolor&quot;: { # A recolor effect applied on an image. # The recolor effect of the image. If not set, the image is not recolored. This property is read-only.
+                      &quot;name&quot;: &quot;A String&quot;, # The name of the recolor effect. The name is determined from the `recolor_stops` by matching the gradient against the colors in the page&#x27;s current color scheme. This property is read-only.
+                      &quot;recolorStops&quot;: [ # The recolor effect is represented by a gradient, which is a list of color stops. The colors in the gradient will replace the corresponding colors at the same position in the color palette and apply to the image. This property is read-only.
+                        { # A color and position in a gradient band.
+                          &quot;alpha&quot;: 3.14, # The alpha value of this color in the gradient band. Defaults to 1.0, fully opaque.
+                          &quot;color&quot;: { # A themeable solid color value. # The color of the gradient stop.
+                            &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                              &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                              &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                              &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                            },
+                            &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                          },
+                          &quot;position&quot;: 3.14, # The relative position of the color stop in the gradient band measured in percentage. The value should be in the interval [0.0, 1.0].
+                        },
+                      ],
+                    },
+                    &quot;shadow&quot;: { # The shadow properties of a page element. If these fields are unset, they may be inherited from a parent placeholder if it exists. If there is no parent, the fields will default to the value used for new page elements created in the Slides editor, which may depend on the page element kind. # The shadow of the image. If not set, the image has no shadow. This property is read-only.
+                      &quot;alignment&quot;: &quot;A String&quot;, # The alignment point of the shadow, that sets the origin for translate, scale and skew of the shadow. This property is read-only.
+                      &quot;alpha&quot;: 3.14, # The alpha of the shadow&#x27;s color, from 0.0 to 1.0.
+                      &quot;blurRadius&quot;: { # A magnitude in a single direction in the specified units. # The radius of the shadow blur. The larger the radius, the more diffuse the shadow becomes.
+                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                      },
+                      &quot;color&quot;: { # A themeable solid color value. # The shadow color value.
+                        &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                          &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                          &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                          &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                        },
+                        &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                      },
+                      &quot;propertyState&quot;: &quot;A String&quot;, # The shadow property state. Updating the shadow on a page element will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no shadow on a page element, set this field to `NOT_RENDERED`. In this case, any other shadow fields set in the same request will be ignored.
+                      &quot;rotateWithShape&quot;: True or False, # Whether the shadow should rotate with the shape. This property is read-only.
+                      &quot;transform&quot;: { # AffineTransform uses a 3x3 matrix with an implied last row of [ 0 0 1 ] to transform source coordinates (x,y) into destination coordinates (x&#x27;, y&#x27;) according to: x&#x27; x = shear_y scale_y translate_y 1 [ 1 ] After transformation, x&#x27; = scale_x * x + shear_x * y + translate_x; y&#x27; = scale_y * y + shear_y * x + translate_y; This message is therefore composed of these six matrix elements. # Transform that encodes the translate, scale, and skew of the shadow, relative to the alignment position.
+                        &quot;scaleX&quot;: 3.14, # The X coordinate scaling element.
+                        &quot;scaleY&quot;: 3.14, # The Y coordinate scaling element.
+                        &quot;shearX&quot;: 3.14, # The X coordinate shearing element.
+                        &quot;shearY&quot;: 3.14, # The Y coordinate shearing element.
+                        &quot;translateX&quot;: 3.14, # The X coordinate translation element.
+                        &quot;translateY&quot;: 3.14, # The Y coordinate translation element.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for translate elements.
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The type of the shadow. This property is read-only.
+                    },
+                    &quot;transparency&quot;: 3.14, # The transparency effect of the image. The value should be in the interval [0.0, 1.0], where 0 means no effect and 1 means completely transparent. This property is read-only.
+                  },
+                  &quot;sourceUrl&quot;: &quot;A String&quot;, # The source URL is the URL used to insert the image. The source URL can be empty.
+                },
+                &quot;line&quot;: { # A PageElement kind representing a non-connector line, straight connector, curved connector, or bent connector. # A line page element.
+                  &quot;lineCategory&quot;: &quot;A String&quot;, # The category of the line. It matches the `category` specified in CreateLineRequest, and can be updated with UpdateLineCategoryRequest.
+                  &quot;lineProperties&quot;: { # The properties of the Line. When unset, these fields default to values that match the appearance of new lines created in the Slides editor. # The properties of the line.
+                    &quot;dashStyle&quot;: &quot;A String&quot;, # The dash style of the line.
+                    &quot;endArrow&quot;: &quot;A String&quot;, # The style of the arrow at the end of the line.
+                    &quot;endConnection&quot;: { # The properties for one end of a Line connection. # The connection at the end of the line. If unset, there is no connection. Only lines with a Type indicating it is a &quot;connector&quot; can have an `end_connection`.
+                      &quot;connectedObjectId&quot;: &quot;A String&quot;, # The object ID of the connected page element. Some page elements, such as groups, tables, and lines do not have connection sites and therefore cannot be connected to a connector line.
+                      &quot;connectionSiteIndex&quot;: 42, # The index of the connection site on the connected page element. In most cases, it corresponds to the predefined connection site index from the ECMA-376 standard. More information on those connection sites can be found in the description of the &quot;cnx&quot; attribute in section 20.1.9.9 and Annex H. &quot;Predefined DrawingML Shape and Text Geometries&quot; of &quot;Office Open XML File Formats-Fundamentals and Markup Language Reference&quot;, part 1 of [ECMA-376 5th edition] (http://www.ecma-international.org/publications/standards/Ecma-376.htm). The position of each connection site can also be viewed from Slides editor.
+                    },
+                    &quot;lineFill&quot;: { # The fill of the line. # The fill of the line. The default line fill matches the defaults for new lines created in the Slides editor.
+                      &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid color fill.
+                        &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                        &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                          &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                            &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                            &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                            &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                          },
+                          &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                        },
+                      },
+                    },
+                    &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the line. If unset, there is no link.
+                      &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                      &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                      &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                      &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                    },
+                    &quot;startArrow&quot;: &quot;A String&quot;, # The style of the arrow at the beginning of the line.
+                    &quot;startConnection&quot;: { # The properties for one end of a Line connection. # The connection at the beginning of the line. If unset, there is no connection. Only lines with a Type indicating it is a &quot;connector&quot; can have a `start_connection`.
+                      &quot;connectedObjectId&quot;: &quot;A String&quot;, # The object ID of the connected page element. Some page elements, such as groups, tables, and lines do not have connection sites and therefore cannot be connected to a connector line.
+                      &quot;connectionSiteIndex&quot;: 42, # The index of the connection site on the connected page element. In most cases, it corresponds to the predefined connection site index from the ECMA-376 standard. More information on those connection sites can be found in the description of the &quot;cnx&quot; attribute in section 20.1.9.9 and Annex H. &quot;Predefined DrawingML Shape and Text Geometries&quot; of &quot;Office Open XML File Formats-Fundamentals and Markup Language Reference&quot;, part 1 of [ECMA-376 5th edition] (http://www.ecma-international.org/publications/standards/Ecma-376.htm). The position of each connection site can also be viewed from Slides editor.
+                    },
+                    &quot;weight&quot;: { # A magnitude in a single direction in the specified units. # The thickness of the line.
+                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                    },
+                  },
+                  &quot;lineType&quot;: &quot;A String&quot;, # The type of the line.
+                },
+                &quot;objectId&quot;: &quot;A String&quot;, # The object ID for this page element. Object IDs used by google.apps.slides.v1.Page and google.apps.slides.v1.PageElement share the same namespace.
+                &quot;shape&quot;: { # A PageElement kind representing a generic shape that does not have a more specific classification. # A generic shape.
+                  &quot;placeholder&quot;: { # The placeholder information that uniquely identifies a placeholder shape. # Placeholders are page elements that inherit from corresponding placeholders on layouts and masters. If set, the shape is a placeholder shape and any inherited properties can be resolved by looking at the parent placeholder identified by the Placeholder.parent_object_id field.
+                    &quot;index&quot;: 42, # The index of the placeholder. If the same placeholder types are present in the same page, they would have different index values.
+                    &quot;parentObjectId&quot;: &quot;A String&quot;, # The object ID of this shape&#x27;s parent placeholder. If unset, the parent placeholder shape does not exist, so the shape does not inherit properties from any other shape.
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the placeholder.
+                  },
+                  &quot;shapeProperties&quot;: { # The properties of a Shape. If the shape is a placeholder shape as determined by the placeholder field, then these properties may be inherited from a parent placeholder shape. Determining the rendered value of the property depends on the corresponding property_state field value. Any text autofit settings on the shape are automatically deactivated by requests that can impact how text fits in the shape. # The properties of the shape.
+                    &quot;autofit&quot;: { # The autofit properties of a Shape. # The autofit properties of the shape. This property is only set for shapes that allow text.
+                      &quot;autofitType&quot;: &quot;A String&quot;, # The autofit type of the shape. If the autofit type is AUTOFIT_TYPE_UNSPECIFIED, the autofit type is inherited from a parent placeholder if it exists. The field is automatically set to NONE if a request is made that might affect text fitting within its bounding text box. In this case the font_scale is applied to the font_size and the line_spacing_reduction is applied to the line_spacing. Both properties are also reset to default values.
+                      &quot;fontScale&quot;: 3.14, # The font scale applied to the shape. For shapes with autofit_type NONE or SHAPE_AUTOFIT, this value is the default value of 1. For TEXT_AUTOFIT, this value multiplied by the font_size gives the font size that is rendered in the editor. This property is read-only.
+                      &quot;lineSpacingReduction&quot;: 3.14, # The line spacing reduction applied to the shape. For shapes with autofit_type NONE or SHAPE_AUTOFIT, this value is the default value of 0. For TEXT_AUTOFIT, this value subtracted from the line_spacing gives the line spacing that is rendered in the editor. This property is read-only.
+                    },
+                    &quot;contentAlignment&quot;: &quot;A String&quot;, # The alignment of the content in the shape. If unspecified, the alignment is inherited from a parent placeholder if it exists. If the shape has no parent, the default alignment matches the alignment for new shapes created in the Slides editor.
+                    &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the shape. If unset, there is no link. Links are not inherited from parent placeholders.
+                      &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                      &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                      &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                      &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                    },
+                    &quot;outline&quot;: { # The outline of a PageElement. If these fields are unset, they may be inherited from a parent placeholder if it exists. If there is no parent, the fields will default to the value used for new page elements created in the Slides editor, which may depend on the page element kind. # The outline of the shape. If unset, the outline is inherited from a parent placeholder if it exists. If the shape has no parent, then the default outline depends on the shape type, matching the defaults for new shapes created in the Slides editor.
+                      &quot;dashStyle&quot;: &quot;A String&quot;, # The dash style of the outline.
+                      &quot;outlineFill&quot;: { # The fill of the outline. # The fill of the outline.
+                        &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid color fill.
+                          &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                          &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                            &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                              &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                              &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                              &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                            },
+                            &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                          },
+                        },
+                      },
+                      &quot;propertyState&quot;: &quot;A String&quot;, # The outline property state. Updating the outline on a page element will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no outline on a page element, set this field to `NOT_RENDERED`. In this case, any other outline fields set in the same request will be ignored.
+                      &quot;weight&quot;: { # A magnitude in a single direction in the specified units. # The thickness of the outline.
+                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                      },
+                    },
+                    &quot;shadow&quot;: { # The shadow properties of a page element. If these fields are unset, they may be inherited from a parent placeholder if it exists. If there is no parent, the fields will default to the value used for new page elements created in the Slides editor, which may depend on the page element kind. # The shadow properties of the shape. If unset, the shadow is inherited from a parent placeholder if it exists. If the shape has no parent, then the default shadow matches the defaults for new shapes created in the Slides editor. This property is read-only.
+                      &quot;alignment&quot;: &quot;A String&quot;, # The alignment point of the shadow, that sets the origin for translate, scale and skew of the shadow. This property is read-only.
+                      &quot;alpha&quot;: 3.14, # The alpha of the shadow&#x27;s color, from 0.0 to 1.0.
+                      &quot;blurRadius&quot;: { # A magnitude in a single direction in the specified units. # The radius of the shadow blur. The larger the radius, the more diffuse the shadow becomes.
+                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                      },
+                      &quot;color&quot;: { # A themeable solid color value. # The shadow color value.
+                        &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                          &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                          &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                          &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                        },
+                        &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                      },
+                      &quot;propertyState&quot;: &quot;A String&quot;, # The shadow property state. Updating the shadow on a page element will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no shadow on a page element, set this field to `NOT_RENDERED`. In this case, any other shadow fields set in the same request will be ignored.
+                      &quot;rotateWithShape&quot;: True or False, # Whether the shadow should rotate with the shape. This property is read-only.
+                      &quot;transform&quot;: { # AffineTransform uses a 3x3 matrix with an implied last row of [ 0 0 1 ] to transform source coordinates (x,y) into destination coordinates (x&#x27;, y&#x27;) according to: x&#x27; x = shear_y scale_y translate_y 1 [ 1 ] After transformation, x&#x27; = scale_x * x + shear_x * y + translate_x; y&#x27; = scale_y * y + shear_y * x + translate_y; This message is therefore composed of these six matrix elements. # Transform that encodes the translate, scale, and skew of the shadow, relative to the alignment position.
+                        &quot;scaleX&quot;: 3.14, # The X coordinate scaling element.
+                        &quot;scaleY&quot;: 3.14, # The Y coordinate scaling element.
+                        &quot;shearX&quot;: 3.14, # The X coordinate shearing element.
+                        &quot;shearY&quot;: 3.14, # The Y coordinate shearing element.
+                        &quot;translateX&quot;: 3.14, # The X coordinate translation element.
+                        &quot;translateY&quot;: 3.14, # The Y coordinate translation element.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for translate elements.
+                      },
+                      &quot;type&quot;: &quot;A String&quot;, # The type of the shadow. This property is read-only.
+                    },
+                    &quot;shapeBackgroundFill&quot;: { # The shape background fill. # The background fill of the shape. If unset, the background fill is inherited from a parent placeholder if it exists. If the shape has no parent, then the default background fill depends on the shape type, matching the defaults for new shapes created in the Slides editor.
+                      &quot;propertyState&quot;: &quot;A String&quot;, # The background fill property state. Updating the fill on a shape will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no fill on a shape, set this field to `NOT_RENDERED`. In this case, any other fill fields set in the same request will be ignored.
+                      &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid color fill.
+                        &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                        &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                          &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                            &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                            &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                            &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                          },
+                          &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                        },
+                      },
+                    },
+                  },
+                  &quot;shapeType&quot;: &quot;A String&quot;, # The type of the shape.
+                  &quot;text&quot;: { # The general text content. The text must reside in a compatible shape (e.g. text box or rectangle) or a table cell in a page. # The text content of the shape.
+                    &quot;lists&quot;: { # The bulleted lists contained in this text, keyed by list ID.
+                      &quot;a_key&quot;: { # A List describes the look and feel of bullets belonging to paragraphs associated with a list. A paragraph that is part of a list has an implicit reference to that list&#x27;s ID.
+                        &quot;listId&quot;: &quot;A String&quot;, # The ID of the list.
+                        &quot;nestingLevel&quot;: { # A map of nesting levels to the properties of bullets at the associated level. A list has at most nine levels of nesting, so the possible values for the keys of this map are 0 through 8, inclusive.
+                          &quot;a_key&quot;: { # Contains properties describing the look and feel of a list bullet at a given level of nesting.
+                            &quot;bulletStyle&quot;: { # Represents the styling that can be applied to a TextRun. If this text is contained in a shape with a parent placeholder, then these text styles may be inherited from the parent. Which text styles are inherited depend on the nesting level of lists: * A text run in a paragraph that is not in a list will inherit its text style from the the newline character in the paragraph at the 0 nesting level of the list inside the parent placeholder. * A text run in a paragraph that is in a list will inherit its text style from the newline character in the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited text styles are represented as unset fields in this message. If text is contained in a shape without a parent placeholder, unsetting these fields will revert the style to a value matching the defaults in the Slides editor. # The style of a bullet at this level of nesting.
+                              &quot;backgroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The background color of the text. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                  &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                    &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                    &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                    &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                  },
+                                  &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                },
+                              },
+                              &quot;baselineOffset&quot;: &quot;A String&quot;, # The text&#x27;s vertical offset from its normal position. Text with `SUPERSCRIPT` or `SUBSCRIPT` baseline offsets is automatically rendered in a smaller font size, computed based on the `font_size` field. The `font_size` itself is not affected by changes in this field.
+                              &quot;bold&quot;: True or False, # Whether or not the text is rendered as bold.
+                              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`. Some fonts can affect the weight of the text. If an update request specifies values for both `font_family` and `bold`, the explicitly-set `bold` value is used.
+                              &quot;fontSize&quot;: { # A magnitude in a single direction in the specified units. # The size of the text&#x27;s font. When read, the `font_size` will specified in points.
+                                &quot;magnitude&quot;: 3.14, # The magnitude.
+                                &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                              },
+                              &quot;foregroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The color of the text itself. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                  &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                    &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                    &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                    &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                  },
+                                  &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                },
+                              },
+                              &quot;italic&quot;: True or False, # Whether or not the text is italicized.
+                              &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the text. If unset, there is no link. Links are not inherited from parent text. Changing the link in an update request causes some other changes to the text style of the range: * When setting a link, the text foreground color will be set to ThemeColorType.HYPERLINK and the text will be underlined. If these fields are modified in the same request, those values will be used instead of the link defaults. * Setting a link on a text range that overlaps with an existing link will also update the existing link to point to the new URL. * Links are not settable on newline characters. As a result, setting a link on a text range that crosses a paragraph boundary, such as `&quot;ABC\n123&quot;`, will separate the newline character(s) into their own text runs. The link will be applied separately to the runs before and after the newline. * Removing a link will update the text style of the range to match the style of the preceding text (or the default text styles if the preceding text is another link) unless different styles are being set in the same request.
+                                &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                                &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                                &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                                &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                              },
+                              &quot;smallCaps&quot;: True or False, # Whether or not the text is in small capital letters.
+                              &quot;strikethrough&quot;: True or False, # Whether or not the text is struck through.
+                              &quot;underline&quot;: True or False, # Whether or not the text is underlined.
+                              &quot;weightedFontFamily&quot;: { # Represents a font family and weight used to style a TextRun. # The font family and rendered weight of the text. This field is an extension of `font_family` meant to support explicit font weights without breaking backwards compatibility. As such, when reading the style of a range of text, the value of `weighted_font_family#font_family` will always be equal to that of `font_family`. However, when writing, if both fields are included in the field mask (either explicitly or through the wildcard `&quot;*&quot;`), their values are reconciled as follows: * If `font_family` is set and `weighted_font_family` is not, the value of `font_family` is applied with weight `400` (&quot;normal&quot;). * If both fields are set, the value of `font_family` must match that of `weighted_font_family#font_family`. If so, the font family and weight of `weighted_font_family` is applied. Otherwise, a 400 bad request error is returned. * If `weighted_font_family` is set and `font_family` is not, the font family and weight of `weighted_font_family` is applied. * If neither field is set, the font family and weight of the text inherit from the parent. Note that these properties cannot inherit separately from each other. If an update request specifies values for both `weighted_font_family` and `bold`, the `weighted_font_family` is applied first, then `bold`. If `weighted_font_family#weight` is not set, it defaults to `400`. If `weighted_font_family` is set, then `weighted_font_family#font_family` must also be set with a non-empty value. Otherwise, a 400 bad request error is returned.
+                                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`.
+                                &quot;weight&quot;: 42, # The rendered weight of the text. This field can have any value that is a multiple of `100` between `100` and `900`, inclusive. This range corresponds to the numerical values described in the CSS 2.1 Specification, [section 15.6](https://www.w3.org/TR/CSS21/fonts.html#font-boldness), with non-numerical values disallowed. Weights greater than or equal to `700` are considered bold, and weights less than `700`are not bold. The default value is `400` (&quot;normal&quot;).
+                              },
+                            },
+                          },
+                        },
+                      },
+                    },
+                    &quot;textElements&quot;: [ # The text contents broken down into its component parts, including styling information. This property is read-only.
+                      { # A TextElement describes the content of a range of indices in the text content of a Shape or TableCell.
+                        &quot;autoText&quot;: { # A TextElement kind that represents auto text. # A TextElement representing a spot in the text that is dynamically replaced with content that can change over time.
+                          &quot;content&quot;: &quot;A String&quot;, # The rendered content of this auto text, if available.
+                          &quot;style&quot;: { # Represents the styling that can be applied to a TextRun. If this text is contained in a shape with a parent placeholder, then these text styles may be inherited from the parent. Which text styles are inherited depend on the nesting level of lists: * A text run in a paragraph that is not in a list will inherit its text style from the the newline character in the paragraph at the 0 nesting level of the list inside the parent placeholder. * A text run in a paragraph that is in a list will inherit its text style from the newline character in the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited text styles are represented as unset fields in this message. If text is contained in a shape without a parent placeholder, unsetting these fields will revert the style to a value matching the defaults in the Slides editor. # The styling applied to this auto text.
+                            &quot;backgroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The background color of the text. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                              &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                  &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                  &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                  &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                },
+                                &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                              },
+                            },
+                            &quot;baselineOffset&quot;: &quot;A String&quot;, # The text&#x27;s vertical offset from its normal position. Text with `SUPERSCRIPT` or `SUBSCRIPT` baseline offsets is automatically rendered in a smaller font size, computed based on the `font_size` field. The `font_size` itself is not affected by changes in this field.
+                            &quot;bold&quot;: True or False, # Whether or not the text is rendered as bold.
+                            &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`. Some fonts can affect the weight of the text. If an update request specifies values for both `font_family` and `bold`, the explicitly-set `bold` value is used.
+                            &quot;fontSize&quot;: { # A magnitude in a single direction in the specified units. # The size of the text&#x27;s font. When read, the `font_size` will specified in points.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                            &quot;foregroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The color of the text itself. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                              &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                  &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                  &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                  &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                },
+                                &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                              },
+                            },
+                            &quot;italic&quot;: True or False, # Whether or not the text is italicized.
+                            &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the text. If unset, there is no link. Links are not inherited from parent text. Changing the link in an update request causes some other changes to the text style of the range: * When setting a link, the text foreground color will be set to ThemeColorType.HYPERLINK and the text will be underlined. If these fields are modified in the same request, those values will be used instead of the link defaults. * Setting a link on a text range that overlaps with an existing link will also update the existing link to point to the new URL. * Links are not settable on newline characters. As a result, setting a link on a text range that crosses a paragraph boundary, such as `&quot;ABC\n123&quot;`, will separate the newline character(s) into their own text runs. The link will be applied separately to the runs before and after the newline. * Removing a link will update the text style of the range to match the style of the preceding text (or the default text styles if the preceding text is another link) unless different styles are being set in the same request.
+                              &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                              &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                              &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                              &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                            },
+                            &quot;smallCaps&quot;: True or False, # Whether or not the text is in small capital letters.
+                            &quot;strikethrough&quot;: True or False, # Whether or not the text is struck through.
+                            &quot;underline&quot;: True or False, # Whether or not the text is underlined.
+                            &quot;weightedFontFamily&quot;: { # Represents a font family and weight used to style a TextRun. # The font family and rendered weight of the text. This field is an extension of `font_family` meant to support explicit font weights without breaking backwards compatibility. As such, when reading the style of a range of text, the value of `weighted_font_family#font_family` will always be equal to that of `font_family`. However, when writing, if both fields are included in the field mask (either explicitly or through the wildcard `&quot;*&quot;`), their values are reconciled as follows: * If `font_family` is set and `weighted_font_family` is not, the value of `font_family` is applied with weight `400` (&quot;normal&quot;). * If both fields are set, the value of `font_family` must match that of `weighted_font_family#font_family`. If so, the font family and weight of `weighted_font_family` is applied. Otherwise, a 400 bad request error is returned. * If `weighted_font_family` is set and `font_family` is not, the font family and weight of `weighted_font_family` is applied. * If neither field is set, the font family and weight of the text inherit from the parent. Note that these properties cannot inherit separately from each other. If an update request specifies values for both `weighted_font_family` and `bold`, the `weighted_font_family` is applied first, then `bold`. If `weighted_font_family#weight` is not set, it defaults to `400`. If `weighted_font_family` is set, then `weighted_font_family#font_family` must also be set with a non-empty value. Otherwise, a 400 bad request error is returned.
+                              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`.
+                              &quot;weight&quot;: 42, # The rendered weight of the text. This field can have any value that is a multiple of `100` between `100` and `900`, inclusive. This range corresponds to the numerical values described in the CSS 2.1 Specification, [section 15.6](https://www.w3.org/TR/CSS21/fonts.html#font-boldness), with non-numerical values disallowed. Weights greater than or equal to `700` are considered bold, and weights less than `700`are not bold. The default value is `400` (&quot;normal&quot;).
+                            },
+                          },
+                          &quot;type&quot;: &quot;A String&quot;, # The type of this auto text.
+                        },
+                        &quot;endIndex&quot;: 42, # The zero-based end index of this text element, exclusive, in Unicode code units.
+                        &quot;paragraphMarker&quot;: { # A TextElement kind that represents the beginning of a new paragraph. # A marker representing the beginning of a new paragraph. The `start_index` and `end_index` of this TextElement represent the range of the paragraph. Other TextElements with an index range contained inside this paragraph&#x27;s range are considered to be part of this paragraph. The range of indices of two separate paragraphs will never overlap.
+                          &quot;bullet&quot;: { # Describes the bullet of a paragraph. # The bullet for this paragraph. If not present, the paragraph does not belong to a list.
+                            &quot;bulletStyle&quot;: { # Represents the styling that can be applied to a TextRun. If this text is contained in a shape with a parent placeholder, then these text styles may be inherited from the parent. Which text styles are inherited depend on the nesting level of lists: * A text run in a paragraph that is not in a list will inherit its text style from the the newline character in the paragraph at the 0 nesting level of the list inside the parent placeholder. * A text run in a paragraph that is in a list will inherit its text style from the newline character in the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited text styles are represented as unset fields in this message. If text is contained in a shape without a parent placeholder, unsetting these fields will revert the style to a value matching the defaults in the Slides editor. # The paragraph specific text style applied to this bullet.
+                              &quot;backgroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The background color of the text. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                  &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                    &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                    &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                    &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                  },
+                                  &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                },
+                              },
+                              &quot;baselineOffset&quot;: &quot;A String&quot;, # The text&#x27;s vertical offset from its normal position. Text with `SUPERSCRIPT` or `SUBSCRIPT` baseline offsets is automatically rendered in a smaller font size, computed based on the `font_size` field. The `font_size` itself is not affected by changes in this field.
+                              &quot;bold&quot;: True or False, # Whether or not the text is rendered as bold.
+                              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`. Some fonts can affect the weight of the text. If an update request specifies values for both `font_family` and `bold`, the explicitly-set `bold` value is used.
+                              &quot;fontSize&quot;: { # A magnitude in a single direction in the specified units. # The size of the text&#x27;s font. When read, the `font_size` will specified in points.
+                                &quot;magnitude&quot;: 3.14, # The magnitude.
+                                &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                              },
+                              &quot;foregroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The color of the text itself. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                  &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                    &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                    &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                    &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                  },
+                                  &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                },
+                              },
+                              &quot;italic&quot;: True or False, # Whether or not the text is italicized.
+                              &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the text. If unset, there is no link. Links are not inherited from parent text. Changing the link in an update request causes some other changes to the text style of the range: * When setting a link, the text foreground color will be set to ThemeColorType.HYPERLINK and the text will be underlined. If these fields are modified in the same request, those values will be used instead of the link defaults. * Setting a link on a text range that overlaps with an existing link will also update the existing link to point to the new URL. * Links are not settable on newline characters. As a result, setting a link on a text range that crosses a paragraph boundary, such as `&quot;ABC\n123&quot;`, will separate the newline character(s) into their own text runs. The link will be applied separately to the runs before and after the newline. * Removing a link will update the text style of the range to match the style of the preceding text (or the default text styles if the preceding text is another link) unless different styles are being set in the same request.
+                                &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                                &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                                &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                                &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                              },
+                              &quot;smallCaps&quot;: True or False, # Whether or not the text is in small capital letters.
+                              &quot;strikethrough&quot;: True or False, # Whether or not the text is struck through.
+                              &quot;underline&quot;: True or False, # Whether or not the text is underlined.
+                              &quot;weightedFontFamily&quot;: { # Represents a font family and weight used to style a TextRun. # The font family and rendered weight of the text. This field is an extension of `font_family` meant to support explicit font weights without breaking backwards compatibility. As such, when reading the style of a range of text, the value of `weighted_font_family#font_family` will always be equal to that of `font_family`. However, when writing, if both fields are included in the field mask (either explicitly or through the wildcard `&quot;*&quot;`), their values are reconciled as follows: * If `font_family` is set and `weighted_font_family` is not, the value of `font_family` is applied with weight `400` (&quot;normal&quot;). * If both fields are set, the value of `font_family` must match that of `weighted_font_family#font_family`. If so, the font family and weight of `weighted_font_family` is applied. Otherwise, a 400 bad request error is returned. * If `weighted_font_family` is set and `font_family` is not, the font family and weight of `weighted_font_family` is applied. * If neither field is set, the font family and weight of the text inherit from the parent. Note that these properties cannot inherit separately from each other. If an update request specifies values for both `weighted_font_family` and `bold`, the `weighted_font_family` is applied first, then `bold`. If `weighted_font_family#weight` is not set, it defaults to `400`. If `weighted_font_family` is set, then `weighted_font_family#font_family` must also be set with a non-empty value. Otherwise, a 400 bad request error is returned.
+                                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`.
+                                &quot;weight&quot;: 42, # The rendered weight of the text. This field can have any value that is a multiple of `100` between `100` and `900`, inclusive. This range corresponds to the numerical values described in the CSS 2.1 Specification, [section 15.6](https://www.w3.org/TR/CSS21/fonts.html#font-boldness), with non-numerical values disallowed. Weights greater than or equal to `700` are considered bold, and weights less than `700`are not bold. The default value is `400` (&quot;normal&quot;).
+                              },
+                            },
+                            &quot;glyph&quot;: &quot;A String&quot;, # The rendered bullet glyph for this paragraph.
+                            &quot;listId&quot;: &quot;A String&quot;, # The ID of the list this paragraph belongs to.
+                            &quot;nestingLevel&quot;: 42, # The nesting level of this paragraph in the list.
+                          },
+                          &quot;style&quot;: { # Styles that apply to a whole paragraph. If this text is contained in a shape with a parent placeholder, then these paragraph styles may be inherited from the parent. Which paragraph styles are inherited depend on the nesting level of lists: * A paragraph not in a list will inherit its paragraph style from the paragraph at the 0 nesting level of the list inside the parent placeholder. * A paragraph in a list will inherit its paragraph style from the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited paragraph styles are represented as unset fields in this message. # The paragraph&#x27;s style
+                            &quot;alignment&quot;: &quot;A String&quot;, # The text alignment for this paragraph.
+                            &quot;direction&quot;: &quot;A String&quot;, # The text direction of this paragraph. If unset, the value defaults to LEFT_TO_RIGHT since text direction is not inherited.
+                            &quot;indentEnd&quot;: { # A magnitude in a single direction in the specified units. # The amount indentation for the paragraph on the side that corresponds to the end of the text, based on the current text direction. If unset, the value is inherited from the parent.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                            &quot;indentFirstLine&quot;: { # A magnitude in a single direction in the specified units. # The amount of indentation for the start of the first line of the paragraph. If unset, the value is inherited from the parent.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                            &quot;indentStart&quot;: { # A magnitude in a single direction in the specified units. # The amount indentation for the paragraph on the side that corresponds to the start of the text, based on the current text direction. If unset, the value is inherited from the parent.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                            &quot;lineSpacing&quot;: 3.14, # The amount of space between lines, as a percentage of normal, where normal is represented as 100.0. If unset, the value is inherited from the parent.
+                            &quot;spaceAbove&quot;: { # A magnitude in a single direction in the specified units. # The amount of extra space above the paragraph. If unset, the value is inherited from the parent.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                            &quot;spaceBelow&quot;: { # A magnitude in a single direction in the specified units. # The amount of extra space below the paragraph. If unset, the value is inherited from the parent.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                            &quot;spacingMode&quot;: &quot;A String&quot;, # The spacing mode for the paragraph.
+                          },
+                        },
+                        &quot;startIndex&quot;: 42, # The zero-based start index of this text element, in Unicode code units.
+                        &quot;textRun&quot;: { # A TextElement kind that represents a run of text that all has the same styling. # A TextElement representing a run of text where all of the characters in the run have the same TextStyle. The `start_index` and `end_index` of TextRuns will always be fully contained in the index range of a single `paragraph_marker` TextElement. In other words, a TextRun will never span multiple paragraphs.
+                          &quot;content&quot;: &quot;A String&quot;, # The text of this run.
+                          &quot;style&quot;: { # Represents the styling that can be applied to a TextRun. If this text is contained in a shape with a parent placeholder, then these text styles may be inherited from the parent. Which text styles are inherited depend on the nesting level of lists: * A text run in a paragraph that is not in a list will inherit its text style from the the newline character in the paragraph at the 0 nesting level of the list inside the parent placeholder. * A text run in a paragraph that is in a list will inherit its text style from the newline character in the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited text styles are represented as unset fields in this message. If text is contained in a shape without a parent placeholder, unsetting these fields will revert the style to a value matching the defaults in the Slides editor. # The styling applied to this run.
+                            &quot;backgroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The background color of the text. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                              &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                  &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                  &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                  &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                },
+                                &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                              },
+                            },
+                            &quot;baselineOffset&quot;: &quot;A String&quot;, # The text&#x27;s vertical offset from its normal position. Text with `SUPERSCRIPT` or `SUBSCRIPT` baseline offsets is automatically rendered in a smaller font size, computed based on the `font_size` field. The `font_size` itself is not affected by changes in this field.
+                            &quot;bold&quot;: True or False, # Whether or not the text is rendered as bold.
+                            &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`. Some fonts can affect the weight of the text. If an update request specifies values for both `font_family` and `bold`, the explicitly-set `bold` value is used.
+                            &quot;fontSize&quot;: { # A magnitude in a single direction in the specified units. # The size of the text&#x27;s font. When read, the `font_size` will specified in points.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                            &quot;foregroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The color of the text itself. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                              &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                  &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                  &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                  &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                },
+                                &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                              },
+                            },
+                            &quot;italic&quot;: True or False, # Whether or not the text is italicized.
+                            &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the text. If unset, there is no link. Links are not inherited from parent text. Changing the link in an update request causes some other changes to the text style of the range: * When setting a link, the text foreground color will be set to ThemeColorType.HYPERLINK and the text will be underlined. If these fields are modified in the same request, those values will be used instead of the link defaults. * Setting a link on a text range that overlaps with an existing link will also update the existing link to point to the new URL. * Links are not settable on newline characters. As a result, setting a link on a text range that crosses a paragraph boundary, such as `&quot;ABC\n123&quot;`, will separate the newline character(s) into their own text runs. The link will be applied separately to the runs before and after the newline. * Removing a link will update the text style of the range to match the style of the preceding text (or the default text styles if the preceding text is another link) unless different styles are being set in the same request.
+                              &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                              &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                              &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                              &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                            },
+                            &quot;smallCaps&quot;: True or False, # Whether or not the text is in small capital letters.
+                            &quot;strikethrough&quot;: True or False, # Whether or not the text is struck through.
+                            &quot;underline&quot;: True or False, # Whether or not the text is underlined.
+                            &quot;weightedFontFamily&quot;: { # Represents a font family and weight used to style a TextRun. # The font family and rendered weight of the text. This field is an extension of `font_family` meant to support explicit font weights without breaking backwards compatibility. As such, when reading the style of a range of text, the value of `weighted_font_family#font_family` will always be equal to that of `font_family`. However, when writing, if both fields are included in the field mask (either explicitly or through the wildcard `&quot;*&quot;`), their values are reconciled as follows: * If `font_family` is set and `weighted_font_family` is not, the value of `font_family` is applied with weight `400` (&quot;normal&quot;). * If both fields are set, the value of `font_family` must match that of `weighted_font_family#font_family`. If so, the font family and weight of `weighted_font_family` is applied. Otherwise, a 400 bad request error is returned. * If `weighted_font_family` is set and `font_family` is not, the font family and weight of `weighted_font_family` is applied. * If neither field is set, the font family and weight of the text inherit from the parent. Note that these properties cannot inherit separately from each other. If an update request specifies values for both `weighted_font_family` and `bold`, the `weighted_font_family` is applied first, then `bold`. If `weighted_font_family#weight` is not set, it defaults to `400`. If `weighted_font_family` is set, then `weighted_font_family#font_family` must also be set with a non-empty value. Otherwise, a 400 bad request error is returned.
+                              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`.
+                              &quot;weight&quot;: 42, # The rendered weight of the text. This field can have any value that is a multiple of `100` between `100` and `900`, inclusive. This range corresponds to the numerical values described in the CSS 2.1 Specification, [section 15.6](https://www.w3.org/TR/CSS21/fonts.html#font-boldness), with non-numerical values disallowed. Weights greater than or equal to `700` are considered bold, and weights less than `700`are not bold. The default value is `400` (&quot;normal&quot;).
+                            },
+                          },
+                        },
+                      },
+                    ],
+                  },
+                },
+                &quot;sheetsChart&quot;: { # A PageElement kind representing a linked chart embedded from Google Sheets. # A linked chart embedded from Google Sheets. Unlinked charts are represented as images.
+                  &quot;chartId&quot;: 42, # The ID of the specific chart in the Google Sheets spreadsheet that is embedded.
+                  &quot;contentUrl&quot;: &quot;A String&quot;, # The URL of an image of the embedded chart, with a default lifetime of 30 minutes. This URL is tagged with the account of the requester. Anyone with the URL effectively accesses the image as the original requester. Access to the image may be lost if the presentation&#x27;s sharing settings change.
+                  &quot;sheetsChartProperties&quot;: { # The properties of the SheetsChart. # The properties of the Sheets chart.
+                    &quot;chartImageProperties&quot;: { # The properties of the Image. # The properties of the embedded chart image.
+                      &quot;brightness&quot;: 3.14, # The brightness effect of the image. The value should be in the interval [-1.0, 1.0], where 0 means no effect. This property is read-only.
+                      &quot;contrast&quot;: 3.14, # The contrast effect of the image. The value should be in the interval [-1.0, 1.0], where 0 means no effect. This property is read-only.
+                      &quot;cropProperties&quot;: { # The crop properties of an object enclosed in a container. For example, an Image. The crop properties is represented by the offsets of four edges which define a crop rectangle. The offsets are measured in percentage from the corresponding edges of the object&#x27;s original bounding rectangle towards inside, relative to the object&#x27;s original dimensions. - If the offset is in the interval (0, 1), the corresponding edge of crop rectangle is positioned inside of the object&#x27;s original bounding rectangle. - If the offset is negative or greater than 1, the corresponding edge of crop rectangle is positioned outside of the object&#x27;s original bounding rectangle. - If the left edge of the crop rectangle is on the right side of its right edge, the object will be flipped horizontally. - If the top edge of the crop rectangle is below its bottom edge, the object will be flipped vertically. - If all offsets and rotation angle is 0, the object is not cropped. After cropping, the content in the crop rectangle will be stretched to fit its container. # The crop properties of the image. If not set, the image is not cropped. This property is read-only.
+                        &quot;angle&quot;: 3.14, # The rotation angle of the crop window around its center, in radians. Rotation angle is applied after the offset.
+                        &quot;bottomOffset&quot;: 3.14, # The offset specifies the bottom edge of the crop rectangle that is located above the original bounding rectangle bottom edge, relative to the object&#x27;s original height.
+                        &quot;leftOffset&quot;: 3.14, # The offset specifies the left edge of the crop rectangle that is located to the right of the original bounding rectangle left edge, relative to the object&#x27;s original width.
+                        &quot;rightOffset&quot;: 3.14, # The offset specifies the right edge of the crop rectangle that is located to the left of the original bounding rectangle right edge, relative to the object&#x27;s original width.
+                        &quot;topOffset&quot;: 3.14, # The offset specifies the top edge of the crop rectangle that is located below the original bounding rectangle top edge, relative to the object&#x27;s original height.
+                      },
+                      &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the image. If unset, there is no link.
+                        &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                        &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                        &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                        &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                      },
+                      &quot;outline&quot;: { # The outline of a PageElement. If these fields are unset, they may be inherited from a parent placeholder if it exists. If there is no parent, the fields will default to the value used for new page elements created in the Slides editor, which may depend on the page element kind. # The outline of the image. If not set, the image has no outline.
+                        &quot;dashStyle&quot;: &quot;A String&quot;, # The dash style of the outline.
+                        &quot;outlineFill&quot;: { # The fill of the outline. # The fill of the outline.
+                          &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid color fill.
+                            &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                            &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                              &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                              },
+                              &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                            },
+                          },
+                        },
+                        &quot;propertyState&quot;: &quot;A String&quot;, # The outline property state. Updating the outline on a page element will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no outline on a page element, set this field to `NOT_RENDERED`. In this case, any other outline fields set in the same request will be ignored.
+                        &quot;weight&quot;: { # A magnitude in a single direction in the specified units. # The thickness of the outline.
+                          &quot;magnitude&quot;: 3.14, # The magnitude.
+                          &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                        },
+                      },
+                      &quot;recolor&quot;: { # A recolor effect applied on an image. # The recolor effect of the image. If not set, the image is not recolored. This property is read-only.
+                        &quot;name&quot;: &quot;A String&quot;, # The name of the recolor effect. The name is determined from the `recolor_stops` by matching the gradient against the colors in the page&#x27;s current color scheme. This property is read-only.
+                        &quot;recolorStops&quot;: [ # The recolor effect is represented by a gradient, which is a list of color stops. The colors in the gradient will replace the corresponding colors at the same position in the color palette and apply to the image. This property is read-only.
+                          { # A color and position in a gradient band.
+                            &quot;alpha&quot;: 3.14, # The alpha value of this color in the gradient band. Defaults to 1.0, fully opaque.
+                            &quot;color&quot;: { # A themeable solid color value. # The color of the gradient stop.
+                              &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                              },
+                              &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                            },
+                            &quot;position&quot;: 3.14, # The relative position of the color stop in the gradient band measured in percentage. The value should be in the interval [0.0, 1.0].
+                          },
+                        ],
+                      },
+                      &quot;shadow&quot;: { # The shadow properties of a page element. If these fields are unset, they may be inherited from a parent placeholder if it exists. If there is no parent, the fields will default to the value used for new page elements created in the Slides editor, which may depend on the page element kind. # The shadow of the image. If not set, the image has no shadow. This property is read-only.
+                        &quot;alignment&quot;: &quot;A String&quot;, # The alignment point of the shadow, that sets the origin for translate, scale and skew of the shadow. This property is read-only.
+                        &quot;alpha&quot;: 3.14, # The alpha of the shadow&#x27;s color, from 0.0 to 1.0.
+                        &quot;blurRadius&quot;: { # A magnitude in a single direction in the specified units. # The radius of the shadow blur. The larger the radius, the more diffuse the shadow becomes.
+                          &quot;magnitude&quot;: 3.14, # The magnitude.
+                          &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                        },
+                        &quot;color&quot;: { # A themeable solid color value. # The shadow color value.
+                          &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                            &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                            &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                            &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                          },
+                          &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                        },
+                        &quot;propertyState&quot;: &quot;A String&quot;, # The shadow property state. Updating the shadow on a page element will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no shadow on a page element, set this field to `NOT_RENDERED`. In this case, any other shadow fields set in the same request will be ignored.
+                        &quot;rotateWithShape&quot;: True or False, # Whether the shadow should rotate with the shape. This property is read-only.
+                        &quot;transform&quot;: { # AffineTransform uses a 3x3 matrix with an implied last row of [ 0 0 1 ] to transform source coordinates (x,y) into destination coordinates (x&#x27;, y&#x27;) according to: x&#x27; x = shear_y scale_y translate_y 1 [ 1 ] After transformation, x&#x27; = scale_x * x + shear_x * y + translate_x; y&#x27; = scale_y * y + shear_y * x + translate_y; This message is therefore composed of these six matrix elements. # Transform that encodes the translate, scale, and skew of the shadow, relative to the alignment position.
+                          &quot;scaleX&quot;: 3.14, # The X coordinate scaling element.
+                          &quot;scaleY&quot;: 3.14, # The Y coordinate scaling element.
+                          &quot;shearX&quot;: 3.14, # The X coordinate shearing element.
+                          &quot;shearY&quot;: 3.14, # The Y coordinate shearing element.
+                          &quot;translateX&quot;: 3.14, # The X coordinate translation element.
+                          &quot;translateY&quot;: 3.14, # The Y coordinate translation element.
+                          &quot;unit&quot;: &quot;A String&quot;, # The units for translate elements.
+                        },
+                        &quot;type&quot;: &quot;A String&quot;, # The type of the shadow. This property is read-only.
+                      },
+                      &quot;transparency&quot;: 3.14, # The transparency effect of the image. The value should be in the interval [0.0, 1.0], where 0 means no effect and 1 means completely transparent. This property is read-only.
+                    },
+                  },
+                  &quot;spreadsheetId&quot;: &quot;A String&quot;, # The ID of the Google Sheets spreadsheet that contains the source chart.
+                },
+                &quot;size&quot;: { # A width and height. # The size of the page element.
+                  &quot;height&quot;: { # A magnitude in a single direction in the specified units. # The height of the object.
+                    &quot;magnitude&quot;: 3.14, # The magnitude.
+                    &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                  },
+                  &quot;width&quot;: { # A magnitude in a single direction in the specified units. # The width of the object.
+                    &quot;magnitude&quot;: 3.14, # The magnitude.
+                    &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                  },
+                },
+                &quot;table&quot;: { # A PageElement kind representing a table. # A table page element.
+                  &quot;columns&quot;: 42, # Number of columns in the table.
+                  &quot;horizontalBorderRows&quot;: [ # Properties of horizontal cell borders. A table&#x27;s horizontal cell borders are represented as a grid. The grid has one more row than the number of rows in the table and the same number of columns as the table. For example, if the table is 3 x 3, its horizontal borders will be represented as a grid with 4 rows and 3 columns.
+                    { # Contents of each border row in a table.
+                      &quot;tableBorderCells&quot;: [ # Properties of each border cell. When a border&#x27;s adjacent table cells are merged, it is not included in the response.
+                        { # The properties of each border cell.
+                          &quot;location&quot;: { # A location of a single table cell within a table. # The location of the border within the border table.
+                            &quot;columnIndex&quot;: 42, # The 0-based column index.
+                            &quot;rowIndex&quot;: 42, # The 0-based row index.
+                          },
+                          &quot;tableBorderProperties&quot;: { # The border styling properties of the TableBorderCell. # The border properties.
+                            &quot;dashStyle&quot;: &quot;A String&quot;, # The dash style of the border.
+                            &quot;tableBorderFill&quot;: { # The fill of the border. # The fill of the table border.
+                              &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid fill.
+                                &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                                &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                                  &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                    &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                    &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                    &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                  },
+                                  &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                },
+                              },
+                            },
+                            &quot;weight&quot;: { # A magnitude in a single direction in the specified units. # The thickness of the border.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                          },
+                        },
+                      ],
+                    },
+                  ],
+                  &quot;rows&quot;: 42, # Number of rows in the table.
+                  &quot;tableColumns&quot;: [ # Properties of each column.
+                    { # Properties of each column in a table.
+                      &quot;columnWidth&quot;: { # A magnitude in a single direction in the specified units. # Width of a column.
+                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                      },
+                    },
+                  ],
+                  &quot;tableRows&quot;: [ # Properties and contents of each row. Cells that span multiple rows are contained in only one of these rows and have a row_span greater than 1.
+                    { # Properties and contents of each row in a table.
+                      &quot;rowHeight&quot;: { # A magnitude in a single direction in the specified units. # Height of a row.
+                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                      },
+                      &quot;tableCells&quot;: [ # Properties and contents of each cell. Cells that span multiple columns are represented only once with a column_span greater than 1. As a result, the length of this collection does not always match the number of columns of the entire table.
+                        { # Properties and contents of each table cell.
+                          &quot;columnSpan&quot;: 42, # Column span of the cell.
+                          &quot;location&quot;: { # A location of a single table cell within a table. # The location of the cell within the table.
+                            &quot;columnIndex&quot;: 42, # The 0-based column index.
+                            &quot;rowIndex&quot;: 42, # The 0-based row index.
+                          },
+                          &quot;rowSpan&quot;: 42, # Row span of the cell.
+                          &quot;tableCellProperties&quot;: { # The properties of the TableCell. # The properties of the table cell.
+                            &quot;contentAlignment&quot;: &quot;A String&quot;, # The alignment of the content in the table cell. The default alignment matches the alignment for newly created table cells in the Slides editor.
+                            &quot;tableCellBackgroundFill&quot;: { # The table cell background fill. # The background fill of the table cell. The default fill matches the fill for newly created table cells in the Slides editor.
+                              &quot;propertyState&quot;: &quot;A String&quot;, # The background fill property state. Updating the fill on a table cell will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no fill on a table cell, set this field to `NOT_RENDERED`. In this case, any other fill fields set in the same request will be ignored.
+                              &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid color fill.
+                                &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                                &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                                  &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                    &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                    &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                    &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                  },
+                                  &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                },
+                              },
+                            },
+                          },
+                          &quot;text&quot;: { # The general text content. The text must reside in a compatible shape (e.g. text box or rectangle) or a table cell in a page. # The text content of the cell.
+                            &quot;lists&quot;: { # The bulleted lists contained in this text, keyed by list ID.
+                              &quot;a_key&quot;: { # A List describes the look and feel of bullets belonging to paragraphs associated with a list. A paragraph that is part of a list has an implicit reference to that list&#x27;s ID.
+                                &quot;listId&quot;: &quot;A String&quot;, # The ID of the list.
+                                &quot;nestingLevel&quot;: { # A map of nesting levels to the properties of bullets at the associated level. A list has at most nine levels of nesting, so the possible values for the keys of this map are 0 through 8, inclusive.
+                                  &quot;a_key&quot;: { # Contains properties describing the look and feel of a list bullet at a given level of nesting.
+                                    &quot;bulletStyle&quot;: { # Represents the styling that can be applied to a TextRun. If this text is contained in a shape with a parent placeholder, then these text styles may be inherited from the parent. Which text styles are inherited depend on the nesting level of lists: * A text run in a paragraph that is not in a list will inherit its text style from the the newline character in the paragraph at the 0 nesting level of the list inside the parent placeholder. * A text run in a paragraph that is in a list will inherit its text style from the newline character in the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited text styles are represented as unset fields in this message. If text is contained in a shape without a parent placeholder, unsetting these fields will revert the style to a value matching the defaults in the Slides editor. # The style of a bullet at this level of nesting.
+                                      &quot;backgroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The background color of the text. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                        &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                          &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                            &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                            &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                            &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                          },
+                                          &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                        },
+                                      },
+                                      &quot;baselineOffset&quot;: &quot;A String&quot;, # The text&#x27;s vertical offset from its normal position. Text with `SUPERSCRIPT` or `SUBSCRIPT` baseline offsets is automatically rendered in a smaller font size, computed based on the `font_size` field. The `font_size` itself is not affected by changes in this field.
+                                      &quot;bold&quot;: True or False, # Whether or not the text is rendered as bold.
+                                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`. Some fonts can affect the weight of the text. If an update request specifies values for both `font_family` and `bold`, the explicitly-set `bold` value is used.
+                                      &quot;fontSize&quot;: { # A magnitude in a single direction in the specified units. # The size of the text&#x27;s font. When read, the `font_size` will specified in points.
+                                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                      },
+                                      &quot;foregroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The color of the text itself. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                        &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                          &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                            &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                            &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                            &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                          },
+                                          &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                        },
+                                      },
+                                      &quot;italic&quot;: True or False, # Whether or not the text is italicized.
+                                      &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the text. If unset, there is no link. Links are not inherited from parent text. Changing the link in an update request causes some other changes to the text style of the range: * When setting a link, the text foreground color will be set to ThemeColorType.HYPERLINK and the text will be underlined. If these fields are modified in the same request, those values will be used instead of the link defaults. * Setting a link on a text range that overlaps with an existing link will also update the existing link to point to the new URL. * Links are not settable on newline characters. As a result, setting a link on a text range that crosses a paragraph boundary, such as `&quot;ABC\n123&quot;`, will separate the newline character(s) into their own text runs. The link will be applied separately to the runs before and after the newline. * Removing a link will update the text style of the range to match the style of the preceding text (or the default text styles if the preceding text is another link) unless different styles are being set in the same request.
+                                        &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                                        &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                                        &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                                        &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                                      },
+                                      &quot;smallCaps&quot;: True or False, # Whether or not the text is in small capital letters.
+                                      &quot;strikethrough&quot;: True or False, # Whether or not the text is struck through.
+                                      &quot;underline&quot;: True or False, # Whether or not the text is underlined.
+                                      &quot;weightedFontFamily&quot;: { # Represents a font family and weight used to style a TextRun. # The font family and rendered weight of the text. This field is an extension of `font_family` meant to support explicit font weights without breaking backwards compatibility. As such, when reading the style of a range of text, the value of `weighted_font_family#font_family` will always be equal to that of `font_family`. However, when writing, if both fields are included in the field mask (either explicitly or through the wildcard `&quot;*&quot;`), their values are reconciled as follows: * If `font_family` is set and `weighted_font_family` is not, the value of `font_family` is applied with weight `400` (&quot;normal&quot;). * If both fields are set, the value of `font_family` must match that of `weighted_font_family#font_family`. If so, the font family and weight of `weighted_font_family` is applied. Otherwise, a 400 bad request error is returned. * If `weighted_font_family` is set and `font_family` is not, the font family and weight of `weighted_font_family` is applied. * If neither field is set, the font family and weight of the text inherit from the parent. Note that these properties cannot inherit separately from each other. If an update request specifies values for both `weighted_font_family` and `bold`, the `weighted_font_family` is applied first, then `bold`. If `weighted_font_family#weight` is not set, it defaults to `400`. If `weighted_font_family` is set, then `weighted_font_family#font_family` must also be set with a non-empty value. Otherwise, a 400 bad request error is returned.
+                                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`.
+                                        &quot;weight&quot;: 42, # The rendered weight of the text. This field can have any value that is a multiple of `100` between `100` and `900`, inclusive. This range corresponds to the numerical values described in the CSS 2.1 Specification, [section 15.6](https://www.w3.org/TR/CSS21/fonts.html#font-boldness), with non-numerical values disallowed. Weights greater than or equal to `700` are considered bold, and weights less than `700`are not bold. The default value is `400` (&quot;normal&quot;).
+                                      },
+                                    },
+                                  },
+                                },
+                              },
+                            },
+                            &quot;textElements&quot;: [ # The text contents broken down into its component parts, including styling information. This property is read-only.
+                              { # A TextElement describes the content of a range of indices in the text content of a Shape or TableCell.
+                                &quot;autoText&quot;: { # A TextElement kind that represents auto text. # A TextElement representing a spot in the text that is dynamically replaced with content that can change over time.
+                                  &quot;content&quot;: &quot;A String&quot;, # The rendered content of this auto text, if available.
+                                  &quot;style&quot;: { # Represents the styling that can be applied to a TextRun. If this text is contained in a shape with a parent placeholder, then these text styles may be inherited from the parent. Which text styles are inherited depend on the nesting level of lists: * A text run in a paragraph that is not in a list will inherit its text style from the the newline character in the paragraph at the 0 nesting level of the list inside the parent placeholder. * A text run in a paragraph that is in a list will inherit its text style from the newline character in the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited text styles are represented as unset fields in this message. If text is contained in a shape without a parent placeholder, unsetting these fields will revert the style to a value matching the defaults in the Slides editor. # The styling applied to this auto text.
+                                    &quot;backgroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The background color of the text. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                      &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                        &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                          &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                          &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                          &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                        },
+                                        &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                      },
+                                    },
+                                    &quot;baselineOffset&quot;: &quot;A String&quot;, # The text&#x27;s vertical offset from its normal position. Text with `SUPERSCRIPT` or `SUBSCRIPT` baseline offsets is automatically rendered in a smaller font size, computed based on the `font_size` field. The `font_size` itself is not affected by changes in this field.
+                                    &quot;bold&quot;: True or False, # Whether or not the text is rendered as bold.
+                                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`. Some fonts can affect the weight of the text. If an update request specifies values for both `font_family` and `bold`, the explicitly-set `bold` value is used.
+                                    &quot;fontSize&quot;: { # A magnitude in a single direction in the specified units. # The size of the text&#x27;s font. When read, the `font_size` will specified in points.
+                                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                    },
+                                    &quot;foregroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The color of the text itself. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                      &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                        &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                          &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                          &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                          &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                        },
+                                        &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                      },
+                                    },
+                                    &quot;italic&quot;: True or False, # Whether or not the text is italicized.
+                                    &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the text. If unset, there is no link. Links are not inherited from parent text. Changing the link in an update request causes some other changes to the text style of the range: * When setting a link, the text foreground color will be set to ThemeColorType.HYPERLINK and the text will be underlined. If these fields are modified in the same request, those values will be used instead of the link defaults. * Setting a link on a text range that overlaps with an existing link will also update the existing link to point to the new URL. * Links are not settable on newline characters. As a result, setting a link on a text range that crosses a paragraph boundary, such as `&quot;ABC\n123&quot;`, will separate the newline character(s) into their own text runs. The link will be applied separately to the runs before and after the newline. * Removing a link will update the text style of the range to match the style of the preceding text (or the default text styles if the preceding text is another link) unless different styles are being set in the same request.
+                                      &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                                      &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                                      &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                                      &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                                    },
+                                    &quot;smallCaps&quot;: True or False, # Whether or not the text is in small capital letters.
+                                    &quot;strikethrough&quot;: True or False, # Whether or not the text is struck through.
+                                    &quot;underline&quot;: True or False, # Whether or not the text is underlined.
+                                    &quot;weightedFontFamily&quot;: { # Represents a font family and weight used to style a TextRun. # The font family and rendered weight of the text. This field is an extension of `font_family` meant to support explicit font weights without breaking backwards compatibility. As such, when reading the style of a range of text, the value of `weighted_font_family#font_family` will always be equal to that of `font_family`. However, when writing, if both fields are included in the field mask (either explicitly or through the wildcard `&quot;*&quot;`), their values are reconciled as follows: * If `font_family` is set and `weighted_font_family` is not, the value of `font_family` is applied with weight `400` (&quot;normal&quot;). * If both fields are set, the value of `font_family` must match that of `weighted_font_family#font_family`. If so, the font family and weight of `weighted_font_family` is applied. Otherwise, a 400 bad request error is returned. * If `weighted_font_family` is set and `font_family` is not, the font family and weight of `weighted_font_family` is applied. * If neither field is set, the font family and weight of the text inherit from the parent. Note that these properties cannot inherit separately from each other. If an update request specifies values for both `weighted_font_family` and `bold`, the `weighted_font_family` is applied first, then `bold`. If `weighted_font_family#weight` is not set, it defaults to `400`. If `weighted_font_family` is set, then `weighted_font_family#font_family` must also be set with a non-empty value. Otherwise, a 400 bad request error is returned.
+                                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`.
+                                      &quot;weight&quot;: 42, # The rendered weight of the text. This field can have any value that is a multiple of `100` between `100` and `900`, inclusive. This range corresponds to the numerical values described in the CSS 2.1 Specification, [section 15.6](https://www.w3.org/TR/CSS21/fonts.html#font-boldness), with non-numerical values disallowed. Weights greater than or equal to `700` are considered bold, and weights less than `700`are not bold. The default value is `400` (&quot;normal&quot;).
+                                    },
+                                  },
+                                  &quot;type&quot;: &quot;A String&quot;, # The type of this auto text.
+                                },
+                                &quot;endIndex&quot;: 42, # The zero-based end index of this text element, exclusive, in Unicode code units.
+                                &quot;paragraphMarker&quot;: { # A TextElement kind that represents the beginning of a new paragraph. # A marker representing the beginning of a new paragraph. The `start_index` and `end_index` of this TextElement represent the range of the paragraph. Other TextElements with an index range contained inside this paragraph&#x27;s range are considered to be part of this paragraph. The range of indices of two separate paragraphs will never overlap.
+                                  &quot;bullet&quot;: { # Describes the bullet of a paragraph. # The bullet for this paragraph. If not present, the paragraph does not belong to a list.
+                                    &quot;bulletStyle&quot;: { # Represents the styling that can be applied to a TextRun. If this text is contained in a shape with a parent placeholder, then these text styles may be inherited from the parent. Which text styles are inherited depend on the nesting level of lists: * A text run in a paragraph that is not in a list will inherit its text style from the the newline character in the paragraph at the 0 nesting level of the list inside the parent placeholder. * A text run in a paragraph that is in a list will inherit its text style from the newline character in the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited text styles are represented as unset fields in this message. If text is contained in a shape without a parent placeholder, unsetting these fields will revert the style to a value matching the defaults in the Slides editor. # The paragraph specific text style applied to this bullet.
+                                      &quot;backgroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The background color of the text. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                        &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                          &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                            &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                            &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                            &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                          },
+                                          &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                        },
+                                      },
+                                      &quot;baselineOffset&quot;: &quot;A String&quot;, # The text&#x27;s vertical offset from its normal position. Text with `SUPERSCRIPT` or `SUBSCRIPT` baseline offsets is automatically rendered in a smaller font size, computed based on the `font_size` field. The `font_size` itself is not affected by changes in this field.
+                                      &quot;bold&quot;: True or False, # Whether or not the text is rendered as bold.
+                                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`. Some fonts can affect the weight of the text. If an update request specifies values for both `font_family` and `bold`, the explicitly-set `bold` value is used.
+                                      &quot;fontSize&quot;: { # A magnitude in a single direction in the specified units. # The size of the text&#x27;s font. When read, the `font_size` will specified in points.
+                                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                      },
+                                      &quot;foregroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The color of the text itself. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                        &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                          &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                            &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                            &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                            &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                          },
+                                          &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                        },
+                                      },
+                                      &quot;italic&quot;: True or False, # Whether or not the text is italicized.
+                                      &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the text. If unset, there is no link. Links are not inherited from parent text. Changing the link in an update request causes some other changes to the text style of the range: * When setting a link, the text foreground color will be set to ThemeColorType.HYPERLINK and the text will be underlined. If these fields are modified in the same request, those values will be used instead of the link defaults. * Setting a link on a text range that overlaps with an existing link will also update the existing link to point to the new URL. * Links are not settable on newline characters. As a result, setting a link on a text range that crosses a paragraph boundary, such as `&quot;ABC\n123&quot;`, will separate the newline character(s) into their own text runs. The link will be applied separately to the runs before and after the newline. * Removing a link will update the text style of the range to match the style of the preceding text (or the default text styles if the preceding text is another link) unless different styles are being set in the same request.
+                                        &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                                        &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                                        &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                                        &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                                      },
+                                      &quot;smallCaps&quot;: True or False, # Whether or not the text is in small capital letters.
+                                      &quot;strikethrough&quot;: True or False, # Whether or not the text is struck through.
+                                      &quot;underline&quot;: True or False, # Whether or not the text is underlined.
+                                      &quot;weightedFontFamily&quot;: { # Represents a font family and weight used to style a TextRun. # The font family and rendered weight of the text. This field is an extension of `font_family` meant to support explicit font weights without breaking backwards compatibility. As such, when reading the style of a range of text, the value of `weighted_font_family#font_family` will always be equal to that of `font_family`. However, when writing, if both fields are included in the field mask (either explicitly or through the wildcard `&quot;*&quot;`), their values are reconciled as follows: * If `font_family` is set and `weighted_font_family` is not, the value of `font_family` is applied with weight `400` (&quot;normal&quot;). * If both fields are set, the value of `font_family` must match that of `weighted_font_family#font_family`. If so, the font family and weight of `weighted_font_family` is applied. Otherwise, a 400 bad request error is returned. * If `weighted_font_family` is set and `font_family` is not, the font family and weight of `weighted_font_family` is applied. * If neither field is set, the font family and weight of the text inherit from the parent. Note that these properties cannot inherit separately from each other. If an update request specifies values for both `weighted_font_family` and `bold`, the `weighted_font_family` is applied first, then `bold`. If `weighted_font_family#weight` is not set, it defaults to `400`. If `weighted_font_family` is set, then `weighted_font_family#font_family` must also be set with a non-empty value. Otherwise, a 400 bad request error is returned.
+                                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`.
+                                        &quot;weight&quot;: 42, # The rendered weight of the text. This field can have any value that is a multiple of `100` between `100` and `900`, inclusive. This range corresponds to the numerical values described in the CSS 2.1 Specification, [section 15.6](https://www.w3.org/TR/CSS21/fonts.html#font-boldness), with non-numerical values disallowed. Weights greater than or equal to `700` are considered bold, and weights less than `700`are not bold. The default value is `400` (&quot;normal&quot;).
+                                      },
+                                    },
+                                    &quot;glyph&quot;: &quot;A String&quot;, # The rendered bullet glyph for this paragraph.
+                                    &quot;listId&quot;: &quot;A String&quot;, # The ID of the list this paragraph belongs to.
+                                    &quot;nestingLevel&quot;: 42, # The nesting level of this paragraph in the list.
+                                  },
+                                  &quot;style&quot;: { # Styles that apply to a whole paragraph. If this text is contained in a shape with a parent placeholder, then these paragraph styles may be inherited from the parent. Which paragraph styles are inherited depend on the nesting level of lists: * A paragraph not in a list will inherit its paragraph style from the paragraph at the 0 nesting level of the list inside the parent placeholder. * A paragraph in a list will inherit its paragraph style from the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited paragraph styles are represented as unset fields in this message. # The paragraph&#x27;s style
+                                    &quot;alignment&quot;: &quot;A String&quot;, # The text alignment for this paragraph.
+                                    &quot;direction&quot;: &quot;A String&quot;, # The text direction of this paragraph. If unset, the value defaults to LEFT_TO_RIGHT since text direction is not inherited.
+                                    &quot;indentEnd&quot;: { # A magnitude in a single direction in the specified units. # The amount indentation for the paragraph on the side that corresponds to the end of the text, based on the current text direction. If unset, the value is inherited from the parent.
+                                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                    },
+                                    &quot;indentFirstLine&quot;: { # A magnitude in a single direction in the specified units. # The amount of indentation for the start of the first line of the paragraph. If unset, the value is inherited from the parent.
+                                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                    },
+                                    &quot;indentStart&quot;: { # A magnitude in a single direction in the specified units. # The amount indentation for the paragraph on the side that corresponds to the start of the text, based on the current text direction. If unset, the value is inherited from the parent.
+                                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                    },
+                                    &quot;lineSpacing&quot;: 3.14, # The amount of space between lines, as a percentage of normal, where normal is represented as 100.0. If unset, the value is inherited from the parent.
+                                    &quot;spaceAbove&quot;: { # A magnitude in a single direction in the specified units. # The amount of extra space above the paragraph. If unset, the value is inherited from the parent.
+                                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                    },
+                                    &quot;spaceBelow&quot;: { # A magnitude in a single direction in the specified units. # The amount of extra space below the paragraph. If unset, the value is inherited from the parent.
+                                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                    },
+                                    &quot;spacingMode&quot;: &quot;A String&quot;, # The spacing mode for the paragraph.
+                                  },
+                                },
+                                &quot;startIndex&quot;: 42, # The zero-based start index of this text element, in Unicode code units.
+                                &quot;textRun&quot;: { # A TextElement kind that represents a run of text that all has the same styling. # A TextElement representing a run of text where all of the characters in the run have the same TextStyle. The `start_index` and `end_index` of TextRuns will always be fully contained in the index range of a single `paragraph_marker` TextElement. In other words, a TextRun will never span multiple paragraphs.
+                                  &quot;content&quot;: &quot;A String&quot;, # The text of this run.
+                                  &quot;style&quot;: { # Represents the styling that can be applied to a TextRun. If this text is contained in a shape with a parent placeholder, then these text styles may be inherited from the parent. Which text styles are inherited depend on the nesting level of lists: * A text run in a paragraph that is not in a list will inherit its text style from the the newline character in the paragraph at the 0 nesting level of the list inside the parent placeholder. * A text run in a paragraph that is in a list will inherit its text style from the newline character in the paragraph at its corresponding nesting level of the list inside the parent placeholder. Inherited text styles are represented as unset fields in this message. If text is contained in a shape without a parent placeholder, unsetting these fields will revert the style to a value matching the defaults in the Slides editor. # The styling applied to this run.
+                                    &quot;backgroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The background color of the text. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                      &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                        &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                          &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                          &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                          &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                        },
+                                        &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                      },
+                                    },
+                                    &quot;baselineOffset&quot;: &quot;A String&quot;, # The text&#x27;s vertical offset from its normal position. Text with `SUPERSCRIPT` or `SUBSCRIPT` baseline offsets is automatically rendered in a smaller font size, computed based on the `font_size` field. The `font_size` itself is not affected by changes in this field.
+                                    &quot;bold&quot;: True or False, # Whether or not the text is rendered as bold.
+                                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`. Some fonts can affect the weight of the text. If an update request specifies values for both `font_family` and `bold`, the explicitly-set `bold` value is used.
+                                    &quot;fontSize&quot;: { # A magnitude in a single direction in the specified units. # The size of the text&#x27;s font. When read, the `font_size` will specified in points.
+                                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                                    },
+                                    &quot;foregroundColor&quot;: { # A color that can either be fully opaque or fully transparent. # The color of the text itself. If set, the color is either opaque or transparent, depending on if the `opaque_color` field in it is set.
+                                      &quot;opaqueColor&quot;: { # A themeable solid color value. # If set, this will be used as an opaque color. If unset, this represents a transparent color.
+                                        &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                          &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                          &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                          &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                        },
+                                        &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                      },
+                                    },
+                                    &quot;italic&quot;: True or False, # Whether or not the text is italicized.
+                                    &quot;link&quot;: { # A hypertext link. # The hyperlink destination of the text. If unset, there is no link. Links are not inherited from parent text. Changing the link in an update request causes some other changes to the text style of the range: * When setting a link, the text foreground color will be set to ThemeColorType.HYPERLINK and the text will be underlined. If these fields are modified in the same request, those values will be used instead of the link defaults. * Setting a link on a text range that overlaps with an existing link will also update the existing link to point to the new URL. * Links are not settable on newline characters. As a result, setting a link on a text range that crosses a paragraph boundary, such as `&quot;ABC\n123&quot;`, will separate the newline character(s) into their own text runs. The link will be applied separately to the runs before and after the newline. * Removing a link will update the text style of the range to match the style of the preceding text (or the default text styles if the preceding text is another link) unless different styles are being set in the same request.
+                                      &quot;pageObjectId&quot;: &quot;A String&quot;, # If set, indicates this is a link to the specific page in this presentation with this ID. A page with this ID may not exist.
+                                      &quot;relativeLink&quot;: &quot;A String&quot;, # If set, indicates this is a link to a slide in this presentation, addressed by its position.
+                                      &quot;slideIndex&quot;: 42, # If set, indicates this is a link to the slide at this zero-based index in the presentation. There may not be a slide at this index.
+                                      &quot;url&quot;: &quot;A String&quot;, # If set, indicates this is a link to the external web page at this URL.
+                                    },
+                                    &quot;smallCaps&quot;: True or False, # Whether or not the text is in small capital letters.
+                                    &quot;strikethrough&quot;: True or False, # Whether or not the text is struck through.
+                                    &quot;underline&quot;: True or False, # Whether or not the text is underlined.
+                                    &quot;weightedFontFamily&quot;: { # Represents a font family and weight used to style a TextRun. # The font family and rendered weight of the text. This field is an extension of `font_family` meant to support explicit font weights without breaking backwards compatibility. As such, when reading the style of a range of text, the value of `weighted_font_family#font_family` will always be equal to that of `font_family`. However, when writing, if both fields are included in the field mask (either explicitly or through the wildcard `&quot;*&quot;`), their values are reconciled as follows: * If `font_family` is set and `weighted_font_family` is not, the value of `font_family` is applied with weight `400` (&quot;normal&quot;). * If both fields are set, the value of `font_family` must match that of `weighted_font_family#font_family`. If so, the font family and weight of `weighted_font_family` is applied. Otherwise, a 400 bad request error is returned. * If `weighted_font_family` is set and `font_family` is not, the font family and weight of `weighted_font_family` is applied. * If neither field is set, the font family and weight of the text inherit from the parent. Note that these properties cannot inherit separately from each other. If an update request specifies values for both `weighted_font_family` and `bold`, the `weighted_font_family` is applied first, then `bold`. If `weighted_font_family#weight` is not set, it defaults to `400`. If `weighted_font_family` is set, then `weighted_font_family#font_family` must also be set with a non-empty value. Otherwise, a 400 bad request error is returned.
+                                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family of the text. The font family can be any font from the Font menu in Slides or from [Google Fonts] (https://fonts.google.com/). If the font name is unrecognized, the text is rendered in `Arial`.
+                                      &quot;weight&quot;: 42, # The rendered weight of the text. This field can have any value that is a multiple of `100` between `100` and `900`, inclusive. This range corresponds to the numerical values described in the CSS 2.1 Specification, [section 15.6](https://www.w3.org/TR/CSS21/fonts.html#font-boldness), with non-numerical values disallowed. Weights greater than or equal to `700` are considered bold, and weights less than `700`are not bold. The default value is `400` (&quot;normal&quot;).
+                                    },
+                                  },
+                                },
+                              },
+                            ],
+                          },
+                        },
+                      ],
+                      &quot;tableRowProperties&quot;: { # Properties of each row in a table. # Properties of the row.
+                        &quot;minRowHeight&quot;: { # A magnitude in a single direction in the specified units. # Minimum height of the row. The row will be rendered in the Slides editor at a height equal to or greater than this value in order to show all the text in the row&#x27;s cell(s).
+                          &quot;magnitude&quot;: 3.14, # The magnitude.
+                          &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                        },
+                      },
+                    },
+                  ],
+                  &quot;verticalBorderRows&quot;: [ # Properties of vertical cell borders. A table&#x27;s vertical cell borders are represented as a grid. The grid has the same number of rows as the table and one more column than the number of columns in the table. For example, if the table is 3 x 3, its vertical borders will be represented as a grid with 3 rows and 4 columns.
+                    { # Contents of each border row in a table.
+                      &quot;tableBorderCells&quot;: [ # Properties of each border cell. When a border&#x27;s adjacent table cells are merged, it is not included in the response.
+                        { # The properties of each border cell.
+                          &quot;location&quot;: { # A location of a single table cell within a table. # The location of the border within the border table.
+                            &quot;columnIndex&quot;: 42, # The 0-based column index.
+                            &quot;rowIndex&quot;: 42, # The 0-based row index.
+                          },
+                          &quot;tableBorderProperties&quot;: { # The border styling properties of the TableBorderCell. # The border properties.
+                            &quot;dashStyle&quot;: &quot;A String&quot;, # The dash style of the border.
+                            &quot;tableBorderFill&quot;: { # The fill of the border. # The fill of the table border.
+                              &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid fill.
+                                &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                                &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                                  &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                                    &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                                    &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                                    &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                                  },
+                                  &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                                },
+                              },
+                            },
+                            &quot;weight&quot;: { # A magnitude in a single direction in the specified units. # The thickness of the border.
+                              &quot;magnitude&quot;: 3.14, # The magnitude.
+                              &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                            },
+                          },
+                        },
+                      ],
+                    },
+                  ],
+                },
+                &quot;title&quot;: &quot;A String&quot;, # The title of the page element. Combined with description to display alt text. The field is not supported for Group elements.
+                &quot;transform&quot;: { # AffineTransform uses a 3x3 matrix with an implied last row of [ 0 0 1 ] to transform source coordinates (x,y) into destination coordinates (x&#x27;, y&#x27;) according to: x&#x27; x = shear_y scale_y translate_y 1 [ 1 ] After transformation, x&#x27; = scale_x * x + shear_x * y + translate_x; y&#x27; = scale_y * y + shear_y * x + translate_y; This message is therefore composed of these six matrix elements. # The transform of the page element. The visual appearance of the page element is determined by its absolute transform. To compute the absolute transform, preconcatenate a page element&#x27;s transform with the transforms of all of its parent groups. If the page element is not in a group, its absolute transform is the same as the value in this field. The initial transform for the newly created Group is always the identity transform.
+                  &quot;scaleX&quot;: 3.14, # The X coordinate scaling element.
+                  &quot;scaleY&quot;: 3.14, # The Y coordinate scaling element.
+                  &quot;shearX&quot;: 3.14, # The X coordinate shearing element.
+                  &quot;shearY&quot;: 3.14, # The Y coordinate shearing element.
+                  &quot;translateX&quot;: 3.14, # The X coordinate translation element.
+                  &quot;translateY&quot;: 3.14, # The Y coordinate translation element.
+                  &quot;unit&quot;: &quot;A String&quot;, # The units for translate elements.
+                },
+                &quot;video&quot;: { # A PageElement kind representing a video. # A video page element.
+                  &quot;id&quot;: &quot;A String&quot;, # The video source&#x27;s unique identifier for this video.
+                  &quot;source&quot;: &quot;A String&quot;, # The video source.
+                  &quot;url&quot;: &quot;A String&quot;, # An URL to a video. The URL is valid as long as the source video exists and sharing settings do not change.
+                  &quot;videoProperties&quot;: { # The properties of the Video. # The properties of the video.
+                    &quot;autoPlay&quot;: True or False, # Whether to enable video autoplay when the page is displayed in present mode. Defaults to false.
+                    &quot;end&quot;: 42, # The time at which to end playback, measured in seconds from the beginning of the video. If set, the end time should be after the start time. If not set or if you set this to a value that exceeds the video&#x27;s length, the video will be played until its end.
+                    &quot;mute&quot;: True or False, # Whether to mute the audio during video playback. Defaults to false.
+                    &quot;outline&quot;: { # The outline of a PageElement. If these fields are unset, they may be inherited from a parent placeholder if it exists. If there is no parent, the fields will default to the value used for new page elements created in the Slides editor, which may depend on the page element kind. # The outline of the video. The default outline matches the defaults for new videos created in the Slides editor.
+                      &quot;dashStyle&quot;: &quot;A String&quot;, # The dash style of the outline.
+                      &quot;outlineFill&quot;: { # The fill of the outline. # The fill of the outline.
+                        &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid color fill.
+                          &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                          &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                            &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                              &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                              &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                              &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                            },
+                            &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                          },
+                        },
+                      },
+                      &quot;propertyState&quot;: &quot;A String&quot;, # The outline property state. Updating the outline on a page element will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no outline on a page element, set this field to `NOT_RENDERED`. In this case, any other outline fields set in the same request will be ignored.
+                      &quot;weight&quot;: { # A magnitude in a single direction in the specified units. # The thickness of the outline.
+                        &quot;magnitude&quot;: 3.14, # The magnitude.
+                        &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                      },
+                    },
+                    &quot;start&quot;: 42, # The time at which to start playback, measured in seconds from the beginning of the video. If set, the start time should be before the end time. If you set this to a value that exceeds the video&#x27;s length in seconds, the video will be played from the last second. If not set, the video will be played from the beginning.
+                  },
+                },
+                &quot;wordArt&quot;: { # A PageElement kind representing word art. # A word art page element.
+                  &quot;renderedText&quot;: &quot;A String&quot;, # The text rendered as word art.
+                },
+              },
+            ],
+            &quot;pageProperties&quot;: { # The properties of the Page. The page will inherit properties from the parent page. Depending on the page type the hierarchy is defined in either SlideProperties or LayoutProperties. # The properties of the page.
+              &quot;colorScheme&quot;: { # The palette of predefined colors for a page. # The color scheme of the page. If unset, the color scheme is inherited from a parent page. If the page has no parent, the color scheme uses a default Slides color scheme, matching the defaults in the Slides editor. Only the concrete colors of the first 12 ThemeColorTypes are editable. In addition, only the color scheme on `Master` pages can be updated. To update the field, a color scheme containing mappings from all the first 12 ThemeColorTypes to their concrete colors must be provided. Colors for the remaining ThemeColorTypes will be ignored.
+                &quot;colors&quot;: [ # The ThemeColorType and corresponding concrete color pairs.
+                  { # A pair mapping a theme color type to the concrete color it represents.
+                    &quot;color&quot;: { # An RGB color. # The concrete color corresponding to the theme color type above.
+                      &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                      &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                      &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                    },
+                    &quot;type&quot;: &quot;A String&quot;, # The type of the theme color.
+                  },
+                ],
+              },
+              &quot;pageBackgroundFill&quot;: { # The page background fill. # The background fill of the page. If unset, the background fill is inherited from a parent page if it exists. If the page has no parent, then the background fill defaults to the corresponding fill in the Slides editor.
+                &quot;propertyState&quot;: &quot;A String&quot;, # The background fill property state. Updating the fill on a page will implicitly update this field to `RENDERED`, unless another value is specified in the same request. To have no fill on a page, set this field to `NOT_RENDERED`. In this case, any other fill fields set in the same request will be ignored.
+                &quot;solidFill&quot;: { # A solid color fill. The page or page element is filled entirely with the specified color value. If any field is unset, its value may be inherited from a parent placeholder if it exists. # Solid color fill.
+                  &quot;alpha&quot;: 3.14, # The fraction of this `color` that should be applied to the pixel. That is, the final pixel color is defined by the equation: pixel color = alpha * (color) + (1.0 - alpha) * (background color) This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color.
+                  &quot;color&quot;: { # A themeable solid color value. # The color value of the solid fill.
+                    &quot;rgbColor&quot;: { # An RGB color. # An opaque RGB color.
+                      &quot;blue&quot;: 3.14, # The blue component of the color, from 0.0 to 1.0.
+                      &quot;green&quot;: 3.14, # The green component of the color, from 0.0 to 1.0.
+                      &quot;red&quot;: 3.14, # The red component of the color, from 0.0 to 1.0.
+                    },
+                    &quot;themeColor&quot;: &quot;A String&quot;, # An opaque theme color.
+                  },
+                },
+                &quot;stretchedPictureFill&quot;: { # The stretched picture fill. The page or page element is filled entirely with the specified picture. The picture is stretched to fit its container. # Stretched picture fill.
+                  &quot;contentUrl&quot;: &quot;A String&quot;, # Reading the content_url: An URL to a picture with a default lifetime of 30 minutes. This URL is tagged with the account of the requester. Anyone with the URL effectively accesses the picture as the original requester. Access to the picture may be lost if the presentation&#x27;s sharing settings change. Writing the content_url: The picture is fetched once at insertion time and a copy is stored for display inside the presentation. Pictures must be less than 50MB in size, cannot exceed 25 megapixels, and must be in one of PNG, JPEG, or GIF format. The provided URL can be at most 2 kB in length.
+                  &quot;size&quot;: { # A width and height. # The original size of the picture fill. This field is read-only.
+                    &quot;height&quot;: { # A magnitude in a single direction in the specified units. # The height of the object.
+                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                    },
+                    &quot;width&quot;: { # A magnitude in a single direction in the specified units. # The width of the object.
+                      &quot;magnitude&quot;: 3.14, # The magnitude.
+                      &quot;unit&quot;: &quot;A String&quot;, # The units for magnitude.
+                    },
+                  },
+                },
+              },
+            },
+            &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
+            &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
+            &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
+          },
         },
       },
       &quot;updateSlidesPosition&quot;: { # Updates the position of slides in the presentation. # Updates the position of a set of slides in the presentation.
@@ -2040,12 +3042,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;locale&quot;: &quot;A String&quot;, # The locale of the presentation, as an IETF BCP 47 language tag.
@@ -3051,12 +4048,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;notesMaster&quot;: { # A page in a presentation. # The notes master in the presentation. It serves three purposes: - Placeholder shapes on a notes master contain the default text styles and shape properties of all placeholder shapes on notes pages. Specifically, a `SLIDE_IMAGE` placeholder shape contains the slide thumbnail, and a `BODY` placeholder shape contains the speaker notes. - The notes master page properties define the common page properties inherited by all notes pages. - Any other shapes on the notes master appear on all notes pages. The notes master is read-only.
@@ -4060,12 +5052,7 @@
     },
     &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
     &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-    &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-      &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-      &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-      &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-      &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-    },
+    &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
   },
   &quot;pageSize&quot;: { # A width and height. # The size of pages in the presentation.
     &quot;height&quot;: { # A magnitude in a single direction in the specified units. # The height of the object.
@@ -5081,12 +6068,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;title&quot;: &quot;A String&quot;, # The title of the presentation.
@@ -6103,12 +7085,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;locale&quot;: &quot;A String&quot;, # The locale of the presentation, as an IETF BCP 47 language tag.
@@ -7114,12 +8091,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;notesMaster&quot;: { # A page in a presentation. # The notes master in the presentation. It serves three purposes: - Placeholder shapes on a notes master contain the default text styles and shape properties of all placeholder shapes on notes pages. Specifically, a `SLIDE_IMAGE` placeholder shape contains the slide thumbnail, and a `BODY` placeholder shape contains the speaker notes. - The notes master page properties define the common page properties inherited by all notes pages. - Any other shapes on the notes master appear on all notes pages. The notes master is read-only.
@@ -8123,12 +9095,7 @@
     },
     &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
     &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-    &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-      &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-      &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-      &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-      &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-    },
+    &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
   },
   &quot;pageSize&quot;: { # A width and height. # The size of pages in the presentation.
     &quot;height&quot;: { # A magnitude in a single direction in the specified units. # The height of the object.
@@ -9144,12 +10111,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;title&quot;: &quot;A String&quot;, # The title of the presentation.
@@ -10173,12 +11135,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;locale&quot;: &quot;A String&quot;, # The locale of the presentation, as an IETF BCP 47 language tag.
@@ -11184,12 +12141,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;notesMaster&quot;: { # A page in a presentation. # The notes master in the presentation. It serves three purposes: - Placeholder shapes on a notes master contain the default text styles and shape properties of all placeholder shapes on notes pages. Specifically, a `SLIDE_IMAGE` placeholder shape contains the slide thumbnail, and a `BODY` placeholder shape contains the speaker notes. - The notes master page properties define the common page properties inherited by all notes pages. - Any other shapes on the notes master appear on all notes pages. The notes master is read-only.
@@ -12193,12 +13145,7 @@
     },
     &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
     &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-    &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-      &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-      &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-      &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-      &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-    },
+    &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
   },
   &quot;pageSize&quot;: { # A width and height. # The size of pages in the presentation.
     &quot;height&quot;: { # A magnitude in a single direction in the specified units. # The height of the object.
@@ -13214,12 +14161,7 @@
       },
       &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
       &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-      &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-        &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-        &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-        &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-        &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-      },
+      &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
     },
   ],
   &quot;title&quot;: &quot;A String&quot;, # The title of the presentation.
diff --git a/docs/dyn/slides_v1.presentations.pages.html b/docs/dyn/slides_v1.presentations.pages.html
index bb9f82c..e43aa02 100644
--- a/docs/dyn/slides_v1.presentations.pages.html
+++ b/docs/dyn/slides_v1.presentations.pages.html
@@ -1105,12 +1105,7 @@
   },
   &quot;pageType&quot;: &quot;A String&quot;, # The type of the page.
   &quot;revisionId&quot;: &quot;A String&quot;, # The revision ID of the presentation containing this page. Can be used in update requests to assert that the presentation revision hasn&#x27;t changed since the last read operation. Only populated if the user has edit access to the presentation. The format of the revision ID may change over time, so it should be treated opaquely. A returned revision ID is only guaranteed to be valid for 24 hours after it has been returned and cannot be shared across users. If the revision ID is unchanged between calls, then the presentation has not changed. Conversely, a changed ID (for the same presentation and user) usually means the presentation has been updated; however, a changed ID can also be due to internal factors such as ID format changes.
-  &quot;slideProperties&quot;: { # The properties of Page that are only relevant for pages with page_type SLIDE. # Slide specific properties. Only set if page_type = SLIDE.
-    &quot;isSkipped&quot;: True or False, # Whether the slide is skipped in the presentation mode. Defaults to false.
-    &quot;layoutObjectId&quot;: &quot;A String&quot;, # The object ID of the layout that this slide is based on. This property is read-only.
-    &quot;masterObjectId&quot;: &quot;A String&quot;, # The object ID of the master that this slide is based on. This property is read-only.
-    &quot;notesPage&quot;: # Object with schema name: Page # The notes page that this slide is associated with. It defines the visual appearance of a notes page when printing or exporting slides with speaker notes. A notes page inherits properties from the notes master. The placeholder shape with type BODY on the notes page contains the speaker notes for this slide. The ID of this shape is identified by the speakerNotesObjectId field. The notes page is read-only except for the text content and styles of the speaker notes shape. This property is read-only.
-  },
+  &quot;slideProperties&quot;: # Object with schema name: SlideProperties # Slide specific properties. Only set if page_type = SLIDE.
 }</pre>
 </div>
 
diff --git a/docs/dyn/spanner_v1.projects.instances.databases.sessions.html b/docs/dyn/spanner_v1.projects.instances.databases.sessions.html
index 963628b..31c2d2f 100644
--- a/docs/dyn/spanner_v1.projects.instances.databases.sessions.html
+++ b/docs/dyn/spanner_v1.projects.instances.databases.sessions.html
@@ -421,7 +421,14 @@
         &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;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+          &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;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.
@@ -479,11 +486,7 @@
           &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;: { # `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.
-              },
+              &quot;type&quot;: # Object with schema name: Type # The type of the field.
             },
           ],
         },
@@ -560,7 +563,14 @@
     &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;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+      &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;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.
@@ -627,11 +637,7 @@
       &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;: { # `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.
-          },
+          &quot;type&quot;: # Object with schema name: Type # The type of the field.
         },
       ],
     },
@@ -697,7 +703,14 @@
     &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;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+      &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;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.
@@ -765,11 +778,7 @@
       &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;: { # `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.
-          },
+          &quot;type&quot;: # Object with schema name: Type # The type of the field.
         },
       ],
     },
@@ -904,7 +913,14 @@
     &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;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+      &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;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.
@@ -1160,11 +1176,7 @@
       &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;: { # `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.
-          },
+          &quot;type&quot;: # Object with schema name: Type # The type of the field.
         },
       ],
     },
@@ -1336,11 +1348,7 @@
       &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;: { # `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.
-          },
+          &quot;type&quot;: # Object with schema name: Type # The type of the field.
         },
       ],
     },
diff --git a/docs/dyn/speech_v1p1beta1.projects.locations.customClasses.html b/docs/dyn/speech_v1p1beta1.projects.locations.customClasses.html
index 558cd75..3c2acb5 100644
--- a/docs/dyn/speech_v1p1beta1.projects.locations.customClasses.html
+++ b/docs/dyn/speech_v1p1beta1.projects.locations.customClasses.html
@@ -120,7 +120,7 @@
     ],
     &quot;name&quot;: &quot;A String&quot;, # The resource name of the custom class.
   },
-  &quot;customClassId&quot;: &quot;A String&quot;, # The ID to use for the custom class, which will become the final component of the custom class&#x27; resource name. This value should be 4-63 characters, and valid characters are /a-z-/.
+  &quot;customClassId&quot;: &quot;A String&quot;, # Required. The ID to use for the custom class, which will become the final component of the custom class&#x27; resource name. This value should be 4-63 characters, and valid characters are /a-z-/.
 }
 
   x__xgafv: string, V1 error format.
diff --git a/docs/dyn/speech_v1p1beta1.projects.locations.phraseSets.html b/docs/dyn/speech_v1p1beta1.projects.locations.phraseSets.html
index 6621ae9..bdc0d2d 100644
--- a/docs/dyn/speech_v1p1beta1.projects.locations.phraseSets.html
+++ b/docs/dyn/speech_v1p1beta1.projects.locations.phraseSets.html
@@ -121,7 +121,7 @@
       },
     ],
   },
-  &quot;phraseSetId&quot;: &quot;A String&quot;, # The ID to use for the phrase set, which will become the final component of the phrase set&#x27;s resource name. This value should be 4-63 characters, and valid characters are /a-z-/.
+  &quot;phraseSetId&quot;: &quot;A String&quot;, # Required. The ID to use for the phrase set, which will become the final component of the phrase set&#x27;s resource name. This value should be 4-63 characters, and valid characters are /a-z-/.
 }
 
   x__xgafv: string, V1 error format.
diff --git a/docs/dyn/speech_v1p1beta1.speech.html b/docs/dyn/speech_v1p1beta1.speech.html
index 0b1fda9..ff43ade 100644
--- a/docs/dyn/speech_v1p1beta1.speech.html
+++ b/docs/dyn/speech_v1p1beta1.speech.html
@@ -174,6 +174,13 @@
         ],
       },
     ],
+    &quot;transcriptNormalization&quot;: { # Transcription normalization configuration. Use transcription normalization to automatically replace parts of the transcript with phrases of your choosing. For StreamingRecognize, this normalization only applies to stable partial transcripts (stability &gt; 0.8) and final transcripts. # Use transcription normalization to automatically replace parts of the transcript with phrases of your choosing. For StreamingRecognize, this normalization only applies to stable partial transcripts (stability &gt; 0.8) and final transcripts.
+      &quot;entries&quot;: { # A single replacement configuration. # A list of replacement entries. We will perform replacement with one entry at a time. For example, the second entry in [&quot;cat&quot; =&gt; &quot;dog&quot;, &quot;mountain cat&quot; =&gt; &quot;mountain dog&quot;] will never be applied because we will always process the first entry before it. At most 100 entries.
+        &quot;caseSensitive&quot;: True or False, # Whether the search is case sensitive.
+        &quot;replace&quot;: &quot;A String&quot;, # What to replace with. Max length is 100 characters.
+        &quot;search&quot;: &quot;A String&quot;, # What to replace. Max length is 100 characters.
+      },
+    },
     &quot;useEnhanced&quot;: True or False, # Set to true to use an enhanced model for speech recognition. If `use_enhanced` is set to true and the `model` field is not set, then an appropriate enhanced model is chosen if an enhanced model exists for the audio. If `use_enhanced` is true and an enhanced version of the specified model does not exist, then the speech is recognized using the standard version of the specified model.
   },
   &quot;outputConfig&quot;: { # Specifies an optional destination for the recognition results. # Optional. Specifies an optional destination for the recognition results.
@@ -295,6 +302,13 @@
         ],
       },
     ],
+    &quot;transcriptNormalization&quot;: { # Transcription normalization configuration. Use transcription normalization to automatically replace parts of the transcript with phrases of your choosing. For StreamingRecognize, this normalization only applies to stable partial transcripts (stability &gt; 0.8) and final transcripts. # Use transcription normalization to automatically replace parts of the transcript with phrases of your choosing. For StreamingRecognize, this normalization only applies to stable partial transcripts (stability &gt; 0.8) and final transcripts.
+      &quot;entries&quot;: { # A single replacement configuration. # A list of replacement entries. We will perform replacement with one entry at a time. For example, the second entry in [&quot;cat&quot; =&gt; &quot;dog&quot;, &quot;mountain cat&quot; =&gt; &quot;mountain dog&quot;] will never be applied because we will always process the first entry before it. At most 100 entries.
+        &quot;caseSensitive&quot;: True or False, # Whether the search is case sensitive.
+        &quot;replace&quot;: &quot;A String&quot;, # What to replace with. Max length is 100 characters.
+        &quot;search&quot;: &quot;A String&quot;, # What to replace. Max length is 100 characters.
+      },
+    },
     &quot;useEnhanced&quot;: True or False, # Set to true to use an enhanced model for speech recognition. If `use_enhanced` is set to true and the `model` field is not set, then an appropriate enhanced model is chosen if an enhanced model exists for the audio. If `use_enhanced` is true and an enhanced version of the specified model does not exist, then the speech is recognized using the standard version of the specified model.
   },
 }
diff --git a/docs/dyn/sqladmin_v1.backupRuns.html b/docs/dyn/sqladmin_v1.backupRuns.html
new file mode 100644
index 0000000..5e77ed8
--- /dev/null
+++ b/docs/dyn/sqladmin_v1.backupRuns.html
@@ -0,0 +1,419 @@
+<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="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.backupRuns.html">backupRuns</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="#delete">delete(project, instance, id, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes the backup taken by a backup run.</p>
+<p class="toc_element">
+  <code><a href="#get">get(project, instance, id, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves a resource containing information about a backup run.</p>
+<p class="toc_element">
+  <code><a href="#insert">insert(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a new backup run on demand.</p>
+<p class="toc_element">
+  <code><a href="#list">list(project, instance, maxResults=None, pageToken=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists all backup runs associated with the project or a given instance and configuration in the reverse chronological order of the backup initiation time.</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>
+<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="delete">delete(project, instance, id, x__xgafv=None)</code>
+  <pre>Deletes the backup taken by a backup run.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  id: string, The ID of the backup run to delete. To find a backup run ID, use the list method. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(project, instance, id, x__xgafv=None)</code>
+  <pre>Retrieves a resource containing information about a backup run.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  id: string, The ID of this backup run. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A BackupRun resource.
+  &quot;backupKind&quot;: &quot;A String&quot;, # Specifies the kind of backup, PHYSICAL or DEFAULT_SNAPSHOT.
+  &quot;description&quot;: &quot;A String&quot;, # The description of this run, only applicable to on-demand backups.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
+    &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
+  },
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
+    &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time the backup operation completed in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+  &quot;enqueuedTime&quot;: &quot;A String&quot;, # The time the run was enqueued in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+  &quot;error&quot;: { # Database instance operation error. # Information about why the backup operation failed. This is only present if the run has the FAILED status.
+    &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+    &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+  },
+  &quot;id&quot;: &quot;A String&quot;, # The identifier for this backup run. Unique only for a specific Cloud SQL instance.
+  &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#backupRun*.
+  &quot;location&quot;: &quot;A String&quot;, # Location of the backups.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time the backup operation actually started in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+  &quot;status&quot;: &quot;A String&quot;, # The status of this run.
+  &quot;type&quot;: &quot;A String&quot;, # The type of this run; can be either &quot;AUTOMATED&quot; or &quot;ON_DEMAND&quot;. This field defaults to &quot;ON_DEMAND&quot; and is ignored, when specified for insert requests.
+  &quot;windowStartTime&quot;: &quot;A String&quot;, # The start time of the backup window during which this the backup was attempted in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="insert">insert(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Creates a new backup run on demand.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A BackupRun resource.
+  &quot;backupKind&quot;: &quot;A String&quot;, # Specifies the kind of backup, PHYSICAL or DEFAULT_SNAPSHOT.
+  &quot;description&quot;: &quot;A String&quot;, # The description of this run, only applicable to on-demand backups.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
+    &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
+  },
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
+    &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time the backup operation completed in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+  &quot;enqueuedTime&quot;: &quot;A String&quot;, # The time the run was enqueued in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+  &quot;error&quot;: { # Database instance operation error. # Information about why the backup operation failed. This is only present if the run has the FAILED status.
+    &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+    &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+  },
+  &quot;id&quot;: &quot;A String&quot;, # The identifier for this backup run. Unique only for a specific Cloud SQL instance.
+  &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#backupRun*.
+  &quot;location&quot;: &quot;A String&quot;, # Location of the backups.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time the backup operation actually started in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+  &quot;status&quot;: &quot;A String&quot;, # The status of this run.
+  &quot;type&quot;: &quot;A String&quot;, # The type of this run; can be either &quot;AUTOMATED&quot; or &quot;ON_DEMAND&quot;. This field defaults to &quot;ON_DEMAND&quot; and is ignored, when specified for insert requests.
+  &quot;windowStartTime&quot;: &quot;A String&quot;, # The start time of the backup window during which this the backup was attempted in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(project, instance, maxResults=None, pageToken=None, x__xgafv=None)</code>
+  <pre>Lists all backup runs associated with the project or a given instance and configuration in the reverse chronological order of the backup initiation time.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID, or &quot;-&quot; for all instances. This does not include the project ID. (required)
+  maxResults: integer, Maximum number of backup runs per response.
+  pageToken: string, A previously-returned page token representing part of the larger set of results to view.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Backup run list results.
+  &quot;items&quot;: [ # A list of backup runs in reverse chronological order of the enqueued time.
+    { # A BackupRun resource.
+      &quot;backupKind&quot;: &quot;A String&quot;, # Specifies the kind of backup, PHYSICAL or DEFAULT_SNAPSHOT.
+      &quot;description&quot;: &quot;A String&quot;, # The description of this run, only applicable to on-demand backups.
+      &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
+        &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
+      },
+      &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
+        &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
+      },
+      &quot;endTime&quot;: &quot;A String&quot;, # The time the backup operation completed in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+      &quot;enqueuedTime&quot;: &quot;A String&quot;, # The time the run was enqueued in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+      &quot;error&quot;: { # Database instance operation error. # Information about why the backup operation failed. This is only present if the run has the FAILED status.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+      &quot;id&quot;: &quot;A String&quot;, # The identifier for this backup run. Unique only for a specific Cloud SQL instance.
+      &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#backupRun*.
+      &quot;location&quot;: &quot;A String&quot;, # Location of the backups.
+      &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+      &quot;startTime&quot;: &quot;A String&quot;, # The time the backup operation actually started in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+      &quot;status&quot;: &quot;A String&quot;, # The status of this run.
+      &quot;type&quot;: &quot;A String&quot;, # The type of this run; can be either &quot;AUTOMATED&quot; or &quot;ON_DEMAND&quot;. This field defaults to &quot;ON_DEMAND&quot; and is ignored, when specified for insert requests.
+      &quot;windowStartTime&quot;: &quot;A String&quot;, # The start time of the backup window during which this the backup was attempted in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#backupRunsList*.
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of 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>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1.connect.html b/docs/dyn/sqladmin_v1.connect.html
new file mode 100644
index 0000000..d6ab29e
--- /dev/null
+++ b/docs/dyn/sqladmin_v1.connect.html
@@ -0,0 +1,172 @@
+<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="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.connect.html">connect</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="#generateEphemeralCert">generateEphemeralCert(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.</p>
+<p class="toc_element">
+  <code><a href="#get">get(project, instance, readTime=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves connect settings about a Cloud SQL instance.</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="generateEphemeralCert">generateEphemeralCert(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Ephemeral certificate creation request.
+  &quot;access_token&quot;: &quot;A String&quot;, # Optional. Access token to include in the signed certificate.
+  &quot;public_key&quot;: &quot;A String&quot;, # PEM encoded public key to include in the signed certificate.
+  &quot;readTime&quot;: &quot;A String&quot;, # Optional. Optional snapshot read timestamp to trade freshness for performance.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Ephemeral certificate creation request.
+  &quot;ephemeralCert&quot;: { # SslCerts Resource # Generated cert
+    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+    &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(project, instance, readTime=None, x__xgafv=None)</code>
+  <pre>Retrieves connect settings about a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  readTime: string, Optional. Optional snapshot read timestamp to trade freshness for performance.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Connect settings retrieval response.
+  &quot;backendType&quot;: &quot;A String&quot;, # **SECOND_GEN**: Cloud SQL database instance. **EXTERNAL**: A database server that is not managed by Google. This property is read-only; use the **tier** property in the **settings** object to determine the database type.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The **databaseVersion** field cannot be changed after instance creation. MySQL instances: **MYSQL_8_0**, **MYSQL_5_7** (default), or **MYSQL_5_6**. PostgreSQL instances: **POSTGRES_9_6**, **POSTGRES_10**, **POSTGRES_11** or **POSTGRES_12** (default). SQL Server instances: **SQLSERVER_2017_STANDARD** (default), **SQLSERVER_2017_ENTERPRISE**, **SQLSERVER_2017_EXPRESS**, or **SQLSERVER_2017_WEB**.
+  &quot;ipAddresses&quot;: [ # The assigned IP addresses for the instance.
+    { # Database instance IP Mapping.
+      &quot;ipAddress&quot;: &quot;A String&quot;, # The IP address assigned.
+      &quot;timeToRetire&quot;: &quot;A String&quot;, # The due time for this IP to be retired in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**. This field is only available when the IP is scheduled to be retired.
+      &quot;type&quot;: &quot;A String&quot;, # The type of this IP address. A **PRIMARY** address is a public address that can accept incoming connections. A **PRIVATE** address is a private address that can accept incoming connections. An **OUTGOING** address is the source address of connections originating from the instance, if supported.
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always `sql#connectSettings`.
+  &quot;serverCaCert&quot;: { # SslCerts Resource # SSL configuration.
+    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+    &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+  },
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1.databases.html b/docs/dyn/sqladmin_v1.databases.html
new file mode 100644
index 0000000..c87c4af
--- /dev/null
+++ b/docs/dyn/sqladmin_v1.databases.html
@@ -0,0 +1,573 @@
+<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="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.databases.html">databases</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="#delete">delete(project, instance, database, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes a database from a Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#get">get(project, instance, database, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves a resource containing information about a database inside a Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#insert">insert(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Inserts a resource containing information about a database inside a Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#list">list(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists databases in the specified Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#patch">patch(project, instance, database, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Partially updates a resource containing information about a database inside a Cloud SQL instance. This method supports patch semantics.</p>
+<p class="toc_element">
+  <code><a href="#update">update(project, instance, database, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates a resource containing information about a database inside a Cloud SQL instance.</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="delete">delete(project, instance, database, x__xgafv=None)</code>
+  <pre>Deletes a database from a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  database: string, Name of the database to be deleted in the instance. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(project, instance, database, x__xgafv=None)</code>
+  <pre>Retrieves a resource containing information about a database inside a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  database: string, Name of the database in the instance. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Represents a SQL database on the Cloud SQL instance.
+  &quot;charset&quot;: &quot;A String&quot;, # The Cloud SQL charset value.
+  &quot;collation&quot;: &quot;A String&quot;, # The Cloud SQL collation value.
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API.
+  &quot;instance&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance. This does not include the project ID.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#database**.
+  &quot;name&quot;: &quot;A String&quot;, # The name of the database in the Cloud SQL instance. This does not include the project ID or instance name.
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;sqlserverDatabaseDetails&quot;: { # Represents a Sql Server database on the Cloud SQL instance.
+    &quot;compatibilityLevel&quot;: 42, # The version of SQL Server with which the database is to be made compatible
+    &quot;recoveryModel&quot;: &quot;A String&quot;, # The recovery model of a SQL Server database
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="insert">insert(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Inserts a resource containing information about a database inside a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Represents a SQL database on the Cloud SQL instance.
+  &quot;charset&quot;: &quot;A String&quot;, # The Cloud SQL charset value.
+  &quot;collation&quot;: &quot;A String&quot;, # The Cloud SQL collation value.
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API.
+  &quot;instance&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance. This does not include the project ID.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#database**.
+  &quot;name&quot;: &quot;A String&quot;, # The name of the database in the Cloud SQL instance. This does not include the project ID or instance name.
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;sqlserverDatabaseDetails&quot;: { # Represents a Sql Server database on the Cloud SQL instance.
+    &quot;compatibilityLevel&quot;: 42, # The version of SQL Server with which the database is to be made compatible
+    &quot;recoveryModel&quot;: &quot;A String&quot;, # The recovery model of a SQL Server database
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(project, instance, x__xgafv=None)</code>
+  <pre>Lists databases in the specified Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Database list response.
+  &quot;items&quot;: [ # List of database resources in the instance.
+    { # Represents a SQL database on the Cloud SQL instance.
+      &quot;charset&quot;: &quot;A String&quot;, # The Cloud SQL charset value.
+      &quot;collation&quot;: &quot;A String&quot;, # The Cloud SQL collation value.
+      &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API.
+      &quot;instance&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance. This does not include the project ID.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#database**.
+      &quot;name&quot;: &quot;A String&quot;, # The name of the database in the Cloud SQL instance. This does not include the project ID or instance name.
+      &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable.
+      &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+      &quot;sqlserverDatabaseDetails&quot;: { # Represents a Sql Server database on the Cloud SQL instance.
+        &quot;compatibilityLevel&quot;: 42, # The version of SQL Server with which the database is to be made compatible
+        &quot;recoveryModel&quot;: &quot;A String&quot;, # The recovery model of a SQL Server database
+      },
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#databasesList*.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="patch">patch(project, instance, database, body=None, x__xgafv=None)</code>
+  <pre>Partially updates a resource containing information about a database inside a Cloud SQL instance. This method supports patch semantics.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  database: string, Name of the database to be updated in the instance. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Represents a SQL database on the Cloud SQL instance.
+  &quot;charset&quot;: &quot;A String&quot;, # The Cloud SQL charset value.
+  &quot;collation&quot;: &quot;A String&quot;, # The Cloud SQL collation value.
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API.
+  &quot;instance&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance. This does not include the project ID.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#database**.
+  &quot;name&quot;: &quot;A String&quot;, # The name of the database in the Cloud SQL instance. This does not include the project ID or instance name.
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;sqlserverDatabaseDetails&quot;: { # Represents a Sql Server database on the Cloud SQL instance.
+    &quot;compatibilityLevel&quot;: 42, # The version of SQL Server with which the database is to be made compatible
+    &quot;recoveryModel&quot;: &quot;A String&quot;, # The recovery model of a SQL Server database
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="update">update(project, instance, database, body=None, x__xgafv=None)</code>
+  <pre>Updates a resource containing information about a database inside a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  database: string, Name of the database to be updated in the instance. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Represents a SQL database on the Cloud SQL instance.
+  &quot;charset&quot;: &quot;A String&quot;, # The Cloud SQL charset value.
+  &quot;collation&quot;: &quot;A String&quot;, # The Cloud SQL collation value.
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API.
+  &quot;instance&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance. This does not include the project ID.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#database**.
+  &quot;name&quot;: &quot;A String&quot;, # The name of the database in the Cloud SQL instance. This does not include the project ID or instance name.
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;sqlserverDatabaseDetails&quot;: { # Represents a Sql Server database on the Cloud SQL instance.
+    &quot;compatibilityLevel&quot;: 42, # The version of SQL Server with which the database is to be made compatible
+    &quot;recoveryModel&quot;: &quot;A String&quot;, # The recovery model of a SQL Server database
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1.flags.html b/docs/dyn/sqladmin_v1.flags.html
new file mode 100644
index 0000000..3d050b1
--- /dev/null
+++ b/docs/dyn/sqladmin_v1.flags.html
@@ -0,0 +1,128 @@
+<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="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.flags.html">flags</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="#list">list(databaseVersion=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists all available database flags for Cloud SQL instances.</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="list">list(databaseVersion=None, x__xgafv=None)</code>
+  <pre>Lists all available database flags for Cloud SQL instances.
+
+Args:
+  databaseVersion: string, Database type and version you want to retrieve flags for. By default, this method returns flags for all database types and versions.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Flags list response.
+  &quot;items&quot;: [ # List of flags.
+    { # A flag resource.
+      &quot;allowedIntValues&quot;: [ # Use this field if only certain integers are accepted. Can be combined with min_value and max_value to add additional values.
+        &quot;A String&quot;,
+      ],
+      &quot;allowedStringValues&quot;: [ # For **STRING** flags, a list of strings that the value can be set to.
+        &quot;A String&quot;,
+      ],
+      &quot;appliesTo&quot;: [ # The database version this flag applies to. Can be **MYSQL_8_0**, **MYSQL_5_6**, or **MYSQL_5_7**.
+        &quot;A String&quot;,
+      ],
+      &quot;inBeta&quot;: True or False, # Whether or not the flag is considered in beta.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#flag**.
+      &quot;maxValue&quot;: &quot;A String&quot;, # For **INTEGER** flags, the maximum allowed value.
+      &quot;minValue&quot;: &quot;A String&quot;, # For **INTEGER** flags, the minimum allowed value.
+      &quot;name&quot;: &quot;A String&quot;, # This is the name of the flag. Flag names always use underscores, not hyphens, for example: **max_allowed_packet**
+      &quot;requiresRestart&quot;: True or False, # Indicates whether changing this flag will trigger a database restart. Only applicable to Second Generation instances.
+      &quot;type&quot;: &quot;A String&quot;, # The type of the flag. Flags are typed to being **BOOLEAN**, **STRING**, **INTEGER** or **NONE**. **NONE** is used for flags which do not take a value, such as **skip_grant_tables**.
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#flagsList**.
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1.html b/docs/dyn/sqladmin_v1.html
index 0330ae8..7d53cf3 100644
--- a/docs/dyn/sqladmin_v1.html
+++ b/docs/dyn/sqladmin_v1.html
@@ -75,16 +75,56 @@
 <h1><a href="sqladmin_v1.html">Cloud SQL Admin API</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
+  <code><a href="sqladmin_v1.backupRuns.html">backupRuns()</a></code>
+</p>
+<p class="firstline">Returns the backupRuns Resource.</p>
+
+<p class="toc_element">
+  <code><a href="sqladmin_v1.connect.html">connect()</a></code>
+</p>
+<p class="firstline">Returns the connect Resource.</p>
+
+<p class="toc_element">
+  <code><a href="sqladmin_v1.databases.html">databases()</a></code>
+</p>
+<p class="firstline">Returns the databases Resource.</p>
+
+<p class="toc_element">
+  <code><a href="sqladmin_v1.flags.html">flags()</a></code>
+</p>
+<p class="firstline">Returns the flags Resource.</p>
+
+<p class="toc_element">
   <code><a href="sqladmin_v1.instances.html">instances()</a></code>
 </p>
 <p class="firstline">Returns the instances Resource.</p>
 
 <p class="toc_element">
+  <code><a href="sqladmin_v1.operations.html">operations()</a></code>
+</p>
+<p class="firstline">Returns the operations Resource.</p>
+
+<p class="toc_element">
   <code><a href="sqladmin_v1.projects.html">projects()</a></code>
 </p>
 <p class="firstline">Returns the projects Resource.</p>
 
 <p class="toc_element">
+  <code><a href="sqladmin_v1.sslCerts.html">sslCerts()</a></code>
+</p>
+<p class="firstline">Returns the sslCerts Resource.</p>
+
+<p class="toc_element">
+  <code><a href="sqladmin_v1.tiers.html">tiers()</a></code>
+</p>
+<p class="firstline">Returns the tiers Resource.</p>
+
+<p class="toc_element">
+  <code><a href="sqladmin_v1.users.html">users()</a></code>
+</p>
+<p class="firstline">Returns the users 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">
diff --git a/docs/dyn/sqladmin_v1.instances.html b/docs/dyn/sqladmin_v1.instances.html
index e76345d..b99f241 100644
--- a/docs/dyn/sqladmin_v1.instances.html
+++ b/docs/dyn/sqladmin_v1.instances.html
@@ -75,21 +75,1251 @@
 <h1><a href="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.instances.html">instances</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
+  <code><a href="#addServerCa">addServerCa(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Adds a new trusted Certificate Authority (CA) version for the specified instance. Required to prepare for a certificate rotation. If a CA version was previously added but never used in a certificate rotation, this operation replaces that version. There cannot be more than one CA version waiting to be rotated in.</p>
+<p class="toc_element">
+  <code><a href="#clone">clone(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a Cloud SQL instance as a clone of the source instance. Using this operation might cause your instance to restart.</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="#delete">delete(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes a Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#demoteMaster">demoteMaster(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Demotes the stand-alone instance to be a Cloud SQL read replica for an external database server.</p>
+<p class="toc_element">
+  <code><a href="#export">export(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Exports data from a Cloud SQL instance to a Cloud Storage bucket as a SQL dump or CSV file.</p>
+<p class="toc_element">
+  <code><a href="#failover">failover(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Initiates a manual failover of a high availability (HA) primary instance to a standby instance, which becomes the primary instance. Users are then rerouted to the new primary. For more information, see the Overview of high availability page in the Cloud SQL documentation. If using Legacy HA (MySQL only), this causes the instance to failover to its failover replica instance.</p>
+<p class="toc_element">
+  <code><a href="#get">get(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves a resource containing information about a Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#import_">import_(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Imports data into a Cloud SQL instance from a SQL dump or CSV file in Cloud Storage.</p>
+<p class="toc_element">
+  <code><a href="#insert">insert(project, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a new Cloud SQL instance.</p>
+<p class="toc_element">
   <code><a href="#list">list(project, filter=None, maxResults=None, pageToken=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Lists instances under a given project.</p>
 <p class="toc_element">
+  <code><a href="#listServerCas">listServerCas(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists all of the trusted Certificate Authorities (CAs) for the specified instance. There can be up to three CAs listed: the CA that was used to sign the certificate that is currently in use, a CA that has been added but not yet used to sign a certificate, and a CA used to sign a certificate that has previously rotated out.</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="#patch">patch(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates settings of a Cloud SQL instance. This method supports patch semantics.</p>
+<p class="toc_element">
+  <code><a href="#promoteReplica">promoteReplica(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Promotes the read replica instance to be a stand-alone Cloud SQL instance. Using this operation might cause your instance to restart.</p>
+<p class="toc_element">
+  <code><a href="#resetSslConfig">resetSslConfig(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes all client certificates and generates a new server SSL certificate for the instance.</p>
+<p class="toc_element">
+  <code><a href="#restart">restart(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Restarts a Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#restoreBackup">restoreBackup(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Restores a backup of a Cloud SQL instance. Using this operation might cause your instance to restart.</p>
+<p class="toc_element">
+  <code><a href="#rotateServerCa">rotateServerCa(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Rotates the server certificate to one signed by the Certificate Authority (CA) version previously added with the addServerCA method.</p>
+<p class="toc_element">
+  <code><a href="#startReplica">startReplica(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Starts the replication in the read replica instance.</p>
+<p class="toc_element">
+  <code><a href="#stopReplica">stopReplica(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Stops the replication in the read replica instance.</p>
+<p class="toc_element">
+  <code><a href="#truncateLog">truncateLog(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Truncate MySQL general and slow query log tables MySQL only.</p>
+<p class="toc_element">
+  <code><a href="#update">update(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates settings of a Cloud SQL instance. Using this operation might cause your instance to restart.</p>
 <h3>Method Details</h3>
 <div class="method">
+    <code class="details" id="addServerCa">addServerCa(project, instance, x__xgafv=None)</code>
+  <pre>Adds a new trusted Certificate Authority (CA) version for the specified instance. Required to prepare for a certificate rotation. If a CA version was previously added but never used in a certificate rotation, this operation replaces that version. There cannot be more than one CA version waiting to be rotated in.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="clone">clone(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Creates a Cloud SQL instance as a clone of the source instance. Using this operation might cause your instance to restart.
+
+Args:
+  project: string, Project ID of the source as well as the clone Cloud SQL instance. (required)
+  instance: string, The ID of the Cloud SQL instance to be cloned (source). This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Database instance clone request.
+  &quot;cloneContext&quot;: { # Database instance clone context. # Contains details about the clone operation.
+    &quot;binLogCoordinates&quot;: { # Binary log coordinates. # Binary log coordinates, if specified, identify the position up to which the source instance is cloned. If not specified, the source instance is cloned up to the most recent binary log coordinates.
+      &quot;binLogFileName&quot;: &quot;A String&quot;, # Name of the binary log file for a Cloud SQL instance.
+      &quot;binLogPosition&quot;: &quot;A String&quot;, # Position (offset) within the binary log file.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#binLogCoordinates*.
+    },
+    &quot;destinationInstanceName&quot;: &quot;A String&quot;, # Name of the Cloud SQL instance to be created as a clone.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#cloneContext*.
+    &quot;pitrTimestampMs&quot;: &quot;A String&quot;, # Reserved for future use.
+    &quot;pointInTime&quot;: &quot;A String&quot;, # Timestamp, if specified, identifies the time to which the source instance is cloned.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</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="delete">delete(project, instance, x__xgafv=None)</code>
+  <pre>Deletes a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance to be deleted. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="demoteMaster">demoteMaster(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Demotes the stand-alone instance to be a Cloud SQL read replica for an external database server.
+
+Args:
+  project: string, ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance name. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Database demote primary instance request.
+  &quot;demoteMasterContext&quot;: { # Database instance demote primary instance context. # Contains details about the demoteMaster operation.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#demoteMasterContext*.
+    &quot;masterInstanceName&quot;: &quot;A String&quot;, # The name of the instance which will act as on-premises primary instance in the replication setup.
+    &quot;replicaConfiguration&quot;: { # Read-replica configuration for connecting to the on-premises primary instance. # Configuration specific to read-replicas replicating from the on-premises primary instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#demoteMasterConfiguration**.
+      &quot;mysqlReplicaConfiguration&quot;: { # Read-replica configuration specific to MySQL databases. # MySQL specific configuration when replicating from a MySQL on-premises primary instance. Replication configuration information such as the username, password, certificates, and keys are not stored in the instance metadata. The configuration information is used only to set up the replication connection and is stored by MySQL in a file named **master.info** in the data directory.
+        &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+        &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+        &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate. The format of the replica&#x27;s private key can be either PKCS #1 or PKCS #8.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#demoteMasterMysqlReplicaConfiguration**.
+        &quot;password&quot;: &quot;A String&quot;, # The password for the replication connection.
+        &quot;username&quot;: &quot;A String&quot;, # The username for the replication connection.
+      },
+    },
+    &quot;verifyGtidConsistency&quot;: True or False, # Verify GTID consistency for demote operation. Default value: *True*. Setting this flag to false enables you to bypass GTID consistency check between on-premises primary instance and Cloud SQL instance during the demotion operation but also exposes you to the risk of future replication failures. Change the value value only if you know the reason for the GTID divergence and are confident that doing so will not cause any replication issues.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="export">export(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Exports data from a Cloud SQL instance to a Cloud Storage bucket as a SQL dump or CSV file.
+
+Args:
+  project: string, Project ID of the project that contains the instance to be exported. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Database instance export request.
+  &quot;exportContext&quot;: { # Database instance export context. # Contains details about the export operation.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="failover">failover(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Initiates a manual failover of a high availability (HA) primary instance to a standby instance, which becomes the primary instance. Users are then rerouted to the new primary. For more information, see the Overview of high availability page in the Cloud SQL documentation. If using Legacy HA (MySQL only), this causes the instance to failover to its failover replica instance.
+
+Args:
+  project: string, ID of the project that contains the read replica. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Instance failover request.
+  &quot;failoverContext&quot;: { # Database instance failover context. # Failover Context.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#failoverContext*.
+    &quot;settingsVersion&quot;: &quot;A String&quot;, # The current settings version of this instance. Request will be rejected if this version doesn&#x27;t match the current settings version.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(project, instance, x__xgafv=None)</code>
+  <pre>Retrieves a resource containing information about a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A Cloud SQL instance resource.
+  &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
+  &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
+  &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
+    &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
+  },
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
+    &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
+  },
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
+  &quot;failoverReplica&quot;: { # The name and status of the failover replica.
+    &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
+    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
+  },
+  &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
+  &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
+  &quot;ipAddresses&quot;: [ # The assigned IP addresses for the instance.
+    { # Database instance IP Mapping.
+      &quot;ipAddress&quot;: &quot;A String&quot;, # The IP address assigned.
+      &quot;timeToRetire&quot;: &quot;A String&quot;, # The due time for this IP to be retired in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**. This field is only available when the IP is scheduled to be retired.
+      &quot;type&quot;: &quot;A String&quot;, # The type of this IP address. A **PRIMARY** address is a public address that can accept incoming connections. A **PRIVATE** address is a private address that can accept incoming connections. An **OUTGOING** address is the source address of connections originating from the instance, if supported.
+    },
+  ],
+  &quot;ipv6Address&quot;: &quot;A String&quot;, # The IPv6 address assigned to the instance. (Deprecated) This property was applicable only to First Generation instances.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#instance*.
+  &quot;masterInstanceName&quot;: &quot;A String&quot;, # The name of the instance which will act as primary in the replication setup.
+  &quot;maxDiskSize&quot;: &quot;A String&quot;, # The maximum disk size of the instance in bytes.
+  &quot;name&quot;: &quot;A String&quot;, # Name of the Cloud SQL instance. This does not include the project ID.
+  &quot;onPremisesConfiguration&quot;: { # On-premises instance configuration. # Configuration specific to on-premises instances.
+    &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+    &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+    &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
+    &quot;dumpFilePath&quot;: &quot;A String&quot;, # The dump file to create the Cloud SQL replica.
+    &quot;hostPort&quot;: &quot;A String&quot;, # The host and port of the on-premises instance in host:port format
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#onPremisesConfiguration*.
+    &quot;password&quot;: &quot;A String&quot;, # The password for connecting to on-premises instance.
+    &quot;username&quot;: &quot;A String&quot;, # The username for connecting to on-premises instance.
+  },
+  &quot;outOfDiskReport&quot;: { # This message wraps up the information written by out-of-disk detection job. # This field represents the report generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
+    &quot;sqlMinRecommendedIncreaseSizeGb&quot;: 42, # The minimum recommended increase size in GigaBytes This field is consumed by the frontend Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend
+    &quot;sqlOutOfDiskState&quot;: &quot;A String&quot;, # This field represents the state generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
+  },
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL instance. The Google apps domain is prefixed if applicable.
+  &quot;region&quot;: &quot;A String&quot;, # The geographical region. Can be *us-central* (*FIRST_GEN* instances only) *us-central1* (*SECOND_GEN* instances only) *asia-east1* or *europe-west1*. Defaults to *us-central* or *us-central1* depending on the instance type. The region cannot be changed after instance creation.
+  &quot;replicaConfiguration&quot;: { # Read-replica configuration for connecting to the primary instance. # Configuration specific to failover replicas and read replicas.
+    &quot;failoverTarget&quot;: True or False, # Specifies if the replica is the failover target. If the field is set to *true* the replica will be designated as a failover replica. In case the primary instance fails, the replica instance will be promoted as the new primary instance. Only one replica can be specified as failover target, and the replica has to be in different zone with the primary instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#replicaConfiguration*.
+    &quot;mysqlReplicaConfiguration&quot;: { # Read-replica configuration specific to MySQL databases. # MySQL specific configuration when replicating from a MySQL on-premises primary instance. Replication configuration information such as the username, password, certificates, and keys are not stored in the instance metadata.The configuration information is used only to set up the replication connection and is stored by MySQL in a file named *master.info* in the data directory.
+      &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+      &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+      &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
+      &quot;connectRetryInterval&quot;: 42, # Seconds to wait between connect retries. MySQL&#x27;s default is 60 seconds.
+      &quot;dumpFilePath&quot;: &quot;A String&quot;, # Path to a SQL dump file in Google Cloud Storage from which the replica instance is to be created. The URI is in the form gs://bucketName/fileName. Compressed gzip files (.gz) are also supported. Dumps have the binlog co-ordinates from which replication begins. This can be accomplished by setting --master-data to 1 when using mysqldump.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#mysqlReplicaConfiguration**.
+      &quot;masterHeartbeatPeriod&quot;: &quot;A String&quot;, # Interval in milliseconds between replication heartbeats.
+      &quot;password&quot;: &quot;A String&quot;, # The password for the replication connection.
+      &quot;sslCipher&quot;: &quot;A String&quot;, # A list of permissible ciphers to use for SSL encryption.
+      &quot;username&quot;: &quot;A String&quot;, # The username for the replication connection.
+      &quot;verifyServerCertificate&quot;: True or False, # Whether or not to check the primary instance&#x27;s Common Name value in the certificate that it sends during the SSL handshake.
+    },
+  },
+  &quot;replicaNames&quot;: [ # The replicas of the instance.
+    &quot;A String&quot;,
+  ],
+  &quot;rootPassword&quot;: &quot;A String&quot;, # Initial root password. Use only on creation.
+  &quot;satisfiesPzs&quot;: True or False, # The status indicating if instance satisfiesPzs. Reserved for future use.
+  &quot;scheduledMaintenance&quot;: { # Any scheduled maintenancce for this instance. # The start time of any upcoming scheduled maintenance for this instance.
+    &quot;canDefer&quot;: True or False,
+    &quot;canReschedule&quot;: True or False, # If the scheduled maintenance can be rescheduled.
+    &quot;scheduleDeadlineTime&quot;: &quot;A String&quot;, # Maintenance cannot be rescheduled to start beyond this deadline.
+    &quot;startTime&quot;: &quot;A String&quot;, # The start time of any upcoming scheduled maintenance for this instance.
+  },
+  &quot;secondaryGceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the failover instance is currently serving from for a regional instance. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary/failover zone. Reserved for future use.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;serverCaCert&quot;: { # SslCerts Resource # SSL configuration.
+    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+    &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+  },
+  &quot;serviceAccountEmailAddress&quot;: &quot;A String&quot;, # The service account email address assigned to the instance. This property is read-only.
+  &quot;settings&quot;: { # Database instance settings. # The user settings.
+    &quot;activationPolicy&quot;: &quot;A String&quot;, # The activation policy specifies when the instance is activated; it is applicable only when the instance state is RUNNABLE. Valid values: **ALWAYS**: The instance is on, and remains so even in the absence of connection requests. **NEVER**: The instance is off; it is not activated, even if a connection request arrives.
+    &quot;activeDirectoryConfig&quot;: { # Active Directory configuration, relevant only for Cloud SQL for SQL Server. # Active Directory configuration, relevant only for Cloud SQL for SQL Server.
+      &quot;domain&quot;: &quot;A String&quot;, # The name of the domain (e.g., mydomain.com).
+      &quot;kind&quot;: &quot;A String&quot;, # This is always sql#activeDirectoryConfig.
+    },
+    &quot;authorizedGaeApplications&quot;: [ # The App Engine app IDs that can access this instance. (Deprecated) Applied to First Generation instances only.
+      &quot;A String&quot;,
+    ],
+    &quot;availabilityType&quot;: &quot;A String&quot;, # Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](https://cloud.google.com/sql/docs/mysql/high-availability).
+    &quot;backupConfiguration&quot;: { # Database instance backup configuration. # The daily backup configuration for the instance.
+      &quot;backupRetentionSettings&quot;: { # We currently only support backup retention by specifying the number of backups we will retain. # Backup retention settings.
+        &quot;retainedBackups&quot;: 42, # Depending on the value of retention_unit, this is used to determine if a backup needs to be deleted. If retention_unit is &#x27;COUNT&#x27;, we will retain this many backups.
+        &quot;retentionUnit&quot;: &quot;A String&quot;, # The unit that &#x27;retained_backups&#x27; represents.
+      },
+      &quot;binaryLogEnabled&quot;: True or False, # (MySQL only) Whether binary log is enabled. If backup configuration is disabled, binarylog must be disabled as well.
+      &quot;enabled&quot;: True or False, # Whether this configuration is enabled.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupConfiguration**.
+      &quot;location&quot;: &quot;A String&quot;, # Location of the backup
+      &quot;pointInTimeRecoveryEnabled&quot;: True or False, # (Postgres only) Whether point in time recovery is enabled.
+      &quot;replicationLogArchivingEnabled&quot;: True or False, # Reserved for future use.
+      &quot;startTime&quot;: &quot;A String&quot;, # Start time for the daily backup configuration in UTC timezone in the 24 hour format - **HH:MM**.
+      &quot;transactionLogRetentionDays&quot;: 42, # The number of days of transaction logs we retain for point in time restore, from 1-7.
+    },
+    &quot;collation&quot;: &quot;A String&quot;, # The name of server Instance collation.
+    &quot;crashSafeReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether database flags for crash-safe replication are enabled. This property was only applicable to First Generation instances.
+    &quot;dataDiskSizeGb&quot;: &quot;A String&quot;, # The size of data disk, in GB. The data disk size minimum is 10GB.
+    &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: **PD_SSD** (default) or **PD_HDD**.
+    &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
+      { # Database flags for Cloud SQL instances.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](https://cloud.google.com/sql/docs/mysql/flags) in the Cloud SQL documentation.
+        &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to **on** for true and **off** for false. This field must be omitted if the flag doesn&#x27;t take a value.
+      },
+    ],
+    &quot;databaseReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether replication is enabled or not.
+    &quot;denyMaintenancePeriods&quot;: [ # Deny maintenance periods
+      { # Deny maintenance Periods. This specifies a date range during when all CSA rollout will be denied.
+        &quot;endDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; end date. If the year of the end date is empty, the year of the start date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
+        &quot;startDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; start date. If the year of the start date is empty, the year of the end date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
+        &quot;time&quot;: &quot;A String&quot;, # Time in UTC when the &quot;deny maintenance period&quot; starts on start_date and ends on end_date. The time is in format: HH:mm:SS, i.e., 00:00:00
+      },
+    ],
+    &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
+      &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
+      &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
+      &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
+      &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
+      &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
+    },
+    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+      &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: **192.168.100.0/24**).
+        { # An entry for an Access Control list.
+          &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+          &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#aclEntry**.
+          &quot;name&quot;: &quot;A String&quot;, # Optional. A label to identify this entry.
+          &quot;value&quot;: &quot;A String&quot;, # The allowlisted value for the access control list.
+        },
+      ],
+      &quot;ipv4Enabled&quot;: True or False, # Whether the instance is assigned a public IP address or not.
+      &quot;privateNetwork&quot;: &quot;A String&quot;, # The resource link for the VPC network from which the Cloud SQL instance is accessible for private IP. For example, **/projects/myProject/global/networks/default**. This setting can be updated, but it cannot be removed after it is set.
+      &quot;requireSsl&quot;: True or False, # Whether SSL connections over IP are enforced or not.
+    },
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#settings**.
+    &quot;locationPreference&quot;: { # Preferred location. This specifies where a Cloud SQL instance is located. Note that if the preferred location is not available, the instance will be located as close as possible within the region. Only one location may be specified. # The location preference settings. This allows the instance to be located as near as possible to Compute Engine zone for better performance.
+      &quot;followGaeApplication&quot;: &quot;A String&quot;, # The App Engine application to follow, it must be in the same region as the Cloud SQL instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#locationPreference**.
+      &quot;secondaryZone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone for the secondary/failover (for example: us-central1-a, us-central1-b, etc.). Reserved for future use.
+      &quot;zone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone (for example: us-central1-a, us-central1-b, etc.).
+    },
+    &quot;maintenanceWindow&quot;: { # Maintenance window. This specifies when a Cloud SQL instance is restarted for system maintenance purposes. # The maintenance window for this instance. This specifies when the instance can be restarted for maintenance purposes.
+      &quot;day&quot;: 42, # day of week (1-7), starting on Monday.
+      &quot;hour&quot;: 42, # hour of day - 0 to 23.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#maintenanceWindow**.
+      &quot;updateTrack&quot;: &quot;A String&quot;, # Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/instance-settings#maintenance-timing-2ndgen).
+    },
+    &quot;pricingPlan&quot;: &quot;A String&quot;, # The pricing plan for this instance. This can be either **PER_USE** or **PACKAGE**. Only **PER_USE** is supported for Second Generation instances.
+    &quot;replicationType&quot;: &quot;A String&quot;, # The type of replication this instance uses. This can be either **ASYNCHRONOUS** or **SYNCHRONOUS**. (Deprecated) This property was only applicable to First Generation instances.
+    &quot;settingsVersion&quot;: &quot;A String&quot;, # The version of instance settings. This is a required field for update method to make sure concurrent updates are handled properly. During update, use the most recent settingsVersion value for this instance and do not try to update this value.
+    &quot;storageAutoResize&quot;: True or False, # Configuration to increase storage size automatically. The default value is true.
+    &quot;storageAutoResizeLimit&quot;: &quot;A String&quot;, # The maximum size to which storage capacity can be automatically increased. The default value is 0, which specifies that there is no limit.
+    &quot;tier&quot;: &quot;A String&quot;, # The tier (or machine type) for this instance, for example **db-custom-1-3840**.
+    &quot;userLabels&quot;: { # User-provided labels, represented as a dictionary where each label is a single key value pair.
+      &quot;a_key&quot;: &quot;A String&quot;,
+    },
+  },
+  &quot;state&quot;: &quot;A String&quot;, # The current serving state of the Cloud SQL instance. This can be one of the following. *SQL_INSTANCE_STATE_UNSPECIFIED*: The state of the instance is unknown. *RUNNABLE*: The instance is running, or has been stopped by owner. *SUSPENDED*: The instance is not available, for example due to problems with billing. *PENDING_DELETE*: The instance is being deleted. *PENDING_CREATE*: The instance is being created. *MAINTENANCE*: The instance is down for maintenance. *FAILED*: The instance creation failed.
+  &quot;suspensionReason&quot;: [ # If the instance state is SUSPENDED, the reason for the suspension.
+    &quot;A String&quot;,
+  ],
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="import_">import_(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Imports data into a Cloud SQL instance from a SQL dump or CSV file in Cloud Storage.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Database instance import request.
+  &quot;importContext&quot;: { # Database instance import context. # Contains details about the import operation.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="insert">insert(project, body=None, x__xgafv=None)</code>
+  <pre>Creates a new Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project to which the newly created Cloud SQL instances should belong. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A Cloud SQL instance resource.
+  &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
+  &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
+  &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
+    &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
+  },
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
+    &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
+  },
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
+  &quot;failoverReplica&quot;: { # The name and status of the failover replica.
+    &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
+    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
+  },
+  &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
+  &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
+  &quot;ipAddresses&quot;: [ # The assigned IP addresses for the instance.
+    { # Database instance IP Mapping.
+      &quot;ipAddress&quot;: &quot;A String&quot;, # The IP address assigned.
+      &quot;timeToRetire&quot;: &quot;A String&quot;, # The due time for this IP to be retired in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**. This field is only available when the IP is scheduled to be retired.
+      &quot;type&quot;: &quot;A String&quot;, # The type of this IP address. A **PRIMARY** address is a public address that can accept incoming connections. A **PRIVATE** address is a private address that can accept incoming connections. An **OUTGOING** address is the source address of connections originating from the instance, if supported.
+    },
+  ],
+  &quot;ipv6Address&quot;: &quot;A String&quot;, # The IPv6 address assigned to the instance. (Deprecated) This property was applicable only to First Generation instances.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#instance*.
+  &quot;masterInstanceName&quot;: &quot;A String&quot;, # The name of the instance which will act as primary in the replication setup.
+  &quot;maxDiskSize&quot;: &quot;A String&quot;, # The maximum disk size of the instance in bytes.
+  &quot;name&quot;: &quot;A String&quot;, # Name of the Cloud SQL instance. This does not include the project ID.
+  &quot;onPremisesConfiguration&quot;: { # On-premises instance configuration. # Configuration specific to on-premises instances.
+    &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+    &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+    &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
+    &quot;dumpFilePath&quot;: &quot;A String&quot;, # The dump file to create the Cloud SQL replica.
+    &quot;hostPort&quot;: &quot;A String&quot;, # The host and port of the on-premises instance in host:port format
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#onPremisesConfiguration*.
+    &quot;password&quot;: &quot;A String&quot;, # The password for connecting to on-premises instance.
+    &quot;username&quot;: &quot;A String&quot;, # The username for connecting to on-premises instance.
+  },
+  &quot;outOfDiskReport&quot;: { # This message wraps up the information written by out-of-disk detection job. # This field represents the report generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
+    &quot;sqlMinRecommendedIncreaseSizeGb&quot;: 42, # The minimum recommended increase size in GigaBytes This field is consumed by the frontend Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend
+    &quot;sqlOutOfDiskState&quot;: &quot;A String&quot;, # This field represents the state generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
+  },
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL instance. The Google apps domain is prefixed if applicable.
+  &quot;region&quot;: &quot;A String&quot;, # The geographical region. Can be *us-central* (*FIRST_GEN* instances only) *us-central1* (*SECOND_GEN* instances only) *asia-east1* or *europe-west1*. Defaults to *us-central* or *us-central1* depending on the instance type. The region cannot be changed after instance creation.
+  &quot;replicaConfiguration&quot;: { # Read-replica configuration for connecting to the primary instance. # Configuration specific to failover replicas and read replicas.
+    &quot;failoverTarget&quot;: True or False, # Specifies if the replica is the failover target. If the field is set to *true* the replica will be designated as a failover replica. In case the primary instance fails, the replica instance will be promoted as the new primary instance. Only one replica can be specified as failover target, and the replica has to be in different zone with the primary instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#replicaConfiguration*.
+    &quot;mysqlReplicaConfiguration&quot;: { # Read-replica configuration specific to MySQL databases. # MySQL specific configuration when replicating from a MySQL on-premises primary instance. Replication configuration information such as the username, password, certificates, and keys are not stored in the instance metadata.The configuration information is used only to set up the replication connection and is stored by MySQL in a file named *master.info* in the data directory.
+      &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+      &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+      &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
+      &quot;connectRetryInterval&quot;: 42, # Seconds to wait between connect retries. MySQL&#x27;s default is 60 seconds.
+      &quot;dumpFilePath&quot;: &quot;A String&quot;, # Path to a SQL dump file in Google Cloud Storage from which the replica instance is to be created. The URI is in the form gs://bucketName/fileName. Compressed gzip files (.gz) are also supported. Dumps have the binlog co-ordinates from which replication begins. This can be accomplished by setting --master-data to 1 when using mysqldump.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#mysqlReplicaConfiguration**.
+      &quot;masterHeartbeatPeriod&quot;: &quot;A String&quot;, # Interval in milliseconds between replication heartbeats.
+      &quot;password&quot;: &quot;A String&quot;, # The password for the replication connection.
+      &quot;sslCipher&quot;: &quot;A String&quot;, # A list of permissible ciphers to use for SSL encryption.
+      &quot;username&quot;: &quot;A String&quot;, # The username for the replication connection.
+      &quot;verifyServerCertificate&quot;: True or False, # Whether or not to check the primary instance&#x27;s Common Name value in the certificate that it sends during the SSL handshake.
+    },
+  },
+  &quot;replicaNames&quot;: [ # The replicas of the instance.
+    &quot;A String&quot;,
+  ],
+  &quot;rootPassword&quot;: &quot;A String&quot;, # Initial root password. Use only on creation.
+  &quot;satisfiesPzs&quot;: True or False, # The status indicating if instance satisfiesPzs. Reserved for future use.
+  &quot;scheduledMaintenance&quot;: { # Any scheduled maintenancce for this instance. # The start time of any upcoming scheduled maintenance for this instance.
+    &quot;canDefer&quot;: True or False,
+    &quot;canReschedule&quot;: True or False, # If the scheduled maintenance can be rescheduled.
+    &quot;scheduleDeadlineTime&quot;: &quot;A String&quot;, # Maintenance cannot be rescheduled to start beyond this deadline.
+    &quot;startTime&quot;: &quot;A String&quot;, # The start time of any upcoming scheduled maintenance for this instance.
+  },
+  &quot;secondaryGceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the failover instance is currently serving from for a regional instance. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary/failover zone. Reserved for future use.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;serverCaCert&quot;: { # SslCerts Resource # SSL configuration.
+    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+    &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+  },
+  &quot;serviceAccountEmailAddress&quot;: &quot;A String&quot;, # The service account email address assigned to the instance. This property is read-only.
+  &quot;settings&quot;: { # Database instance settings. # The user settings.
+    &quot;activationPolicy&quot;: &quot;A String&quot;, # The activation policy specifies when the instance is activated; it is applicable only when the instance state is RUNNABLE. Valid values: **ALWAYS**: The instance is on, and remains so even in the absence of connection requests. **NEVER**: The instance is off; it is not activated, even if a connection request arrives.
+    &quot;activeDirectoryConfig&quot;: { # Active Directory configuration, relevant only for Cloud SQL for SQL Server. # Active Directory configuration, relevant only for Cloud SQL for SQL Server.
+      &quot;domain&quot;: &quot;A String&quot;, # The name of the domain (e.g., mydomain.com).
+      &quot;kind&quot;: &quot;A String&quot;, # This is always sql#activeDirectoryConfig.
+    },
+    &quot;authorizedGaeApplications&quot;: [ # The App Engine app IDs that can access this instance. (Deprecated) Applied to First Generation instances only.
+      &quot;A String&quot;,
+    ],
+    &quot;availabilityType&quot;: &quot;A String&quot;, # Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](https://cloud.google.com/sql/docs/mysql/high-availability).
+    &quot;backupConfiguration&quot;: { # Database instance backup configuration. # The daily backup configuration for the instance.
+      &quot;backupRetentionSettings&quot;: { # We currently only support backup retention by specifying the number of backups we will retain. # Backup retention settings.
+        &quot;retainedBackups&quot;: 42, # Depending on the value of retention_unit, this is used to determine if a backup needs to be deleted. If retention_unit is &#x27;COUNT&#x27;, we will retain this many backups.
+        &quot;retentionUnit&quot;: &quot;A String&quot;, # The unit that &#x27;retained_backups&#x27; represents.
+      },
+      &quot;binaryLogEnabled&quot;: True or False, # (MySQL only) Whether binary log is enabled. If backup configuration is disabled, binarylog must be disabled as well.
+      &quot;enabled&quot;: True or False, # Whether this configuration is enabled.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupConfiguration**.
+      &quot;location&quot;: &quot;A String&quot;, # Location of the backup
+      &quot;pointInTimeRecoveryEnabled&quot;: True or False, # (Postgres only) Whether point in time recovery is enabled.
+      &quot;replicationLogArchivingEnabled&quot;: True or False, # Reserved for future use.
+      &quot;startTime&quot;: &quot;A String&quot;, # Start time for the daily backup configuration in UTC timezone in the 24 hour format - **HH:MM**.
+      &quot;transactionLogRetentionDays&quot;: 42, # The number of days of transaction logs we retain for point in time restore, from 1-7.
+    },
+    &quot;collation&quot;: &quot;A String&quot;, # The name of server Instance collation.
+    &quot;crashSafeReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether database flags for crash-safe replication are enabled. This property was only applicable to First Generation instances.
+    &quot;dataDiskSizeGb&quot;: &quot;A String&quot;, # The size of data disk, in GB. The data disk size minimum is 10GB.
+    &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: **PD_SSD** (default) or **PD_HDD**.
+    &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
+      { # Database flags for Cloud SQL instances.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](https://cloud.google.com/sql/docs/mysql/flags) in the Cloud SQL documentation.
+        &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to **on** for true and **off** for false. This field must be omitted if the flag doesn&#x27;t take a value.
+      },
+    ],
+    &quot;databaseReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether replication is enabled or not.
+    &quot;denyMaintenancePeriods&quot;: [ # Deny maintenance periods
+      { # Deny maintenance Periods. This specifies a date range during when all CSA rollout will be denied.
+        &quot;endDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; end date. If the year of the end date is empty, the year of the start date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
+        &quot;startDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; start date. If the year of the start date is empty, the year of the end date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
+        &quot;time&quot;: &quot;A String&quot;, # Time in UTC when the &quot;deny maintenance period&quot; starts on start_date and ends on end_date. The time is in format: HH:mm:SS, i.e., 00:00:00
+      },
+    ],
+    &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
+      &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
+      &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
+      &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
+      &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
+      &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
+    },
+    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+      &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: **192.168.100.0/24**).
+        { # An entry for an Access Control list.
+          &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+          &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#aclEntry**.
+          &quot;name&quot;: &quot;A String&quot;, # Optional. A label to identify this entry.
+          &quot;value&quot;: &quot;A String&quot;, # The allowlisted value for the access control list.
+        },
+      ],
+      &quot;ipv4Enabled&quot;: True or False, # Whether the instance is assigned a public IP address or not.
+      &quot;privateNetwork&quot;: &quot;A String&quot;, # The resource link for the VPC network from which the Cloud SQL instance is accessible for private IP. For example, **/projects/myProject/global/networks/default**. This setting can be updated, but it cannot be removed after it is set.
+      &quot;requireSsl&quot;: True or False, # Whether SSL connections over IP are enforced or not.
+    },
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#settings**.
+    &quot;locationPreference&quot;: { # Preferred location. This specifies where a Cloud SQL instance is located. Note that if the preferred location is not available, the instance will be located as close as possible within the region. Only one location may be specified. # The location preference settings. This allows the instance to be located as near as possible to Compute Engine zone for better performance.
+      &quot;followGaeApplication&quot;: &quot;A String&quot;, # The App Engine application to follow, it must be in the same region as the Cloud SQL instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#locationPreference**.
+      &quot;secondaryZone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone for the secondary/failover (for example: us-central1-a, us-central1-b, etc.). Reserved for future use.
+      &quot;zone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone (for example: us-central1-a, us-central1-b, etc.).
+    },
+    &quot;maintenanceWindow&quot;: { # Maintenance window. This specifies when a Cloud SQL instance is restarted for system maintenance purposes. # The maintenance window for this instance. This specifies when the instance can be restarted for maintenance purposes.
+      &quot;day&quot;: 42, # day of week (1-7), starting on Monday.
+      &quot;hour&quot;: 42, # hour of day - 0 to 23.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#maintenanceWindow**.
+      &quot;updateTrack&quot;: &quot;A String&quot;, # Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/instance-settings#maintenance-timing-2ndgen).
+    },
+    &quot;pricingPlan&quot;: &quot;A String&quot;, # The pricing plan for this instance. This can be either **PER_USE** or **PACKAGE**. Only **PER_USE** is supported for Second Generation instances.
+    &quot;replicationType&quot;: &quot;A String&quot;, # The type of replication this instance uses. This can be either **ASYNCHRONOUS** or **SYNCHRONOUS**. (Deprecated) This property was only applicable to First Generation instances.
+    &quot;settingsVersion&quot;: &quot;A String&quot;, # The version of instance settings. This is a required field for update method to make sure concurrent updates are handled properly. During update, use the most recent settingsVersion value for this instance and do not try to update this value.
+    &quot;storageAutoResize&quot;: True or False, # Configuration to increase storage size automatically. The default value is true.
+    &quot;storageAutoResizeLimit&quot;: &quot;A String&quot;, # The maximum size to which storage capacity can be automatically increased. The default value is 0, which specifies that there is no limit.
+    &quot;tier&quot;: &quot;A String&quot;, # The tier (or machine type) for this instance, for example **db-custom-1-3840**.
+    &quot;userLabels&quot;: { # User-provided labels, represented as a dictionary where each label is a single key value pair.
+      &quot;a_key&quot;: &quot;A String&quot;,
+    },
+  },
+  &quot;state&quot;: &quot;A String&quot;, # The current serving state of the Cloud SQL instance. This can be one of the following. *SQL_INSTANCE_STATE_UNSPECIFIED*: The state of the instance is unknown. *RUNNABLE*: The instance is running, or has been stopped by owner. *SUSPENDED*: The instance is not available, for example due to problems with billing. *PENDING_DELETE*: The instance is being deleted. *PENDING_CREATE*: The instance is being created. *MAINTENANCE*: The instance is down for maintenance. *FAILED*: The instance creation failed.
+  &quot;suspensionReason&quot;: [ # If the instance state is SUSPENDED, the reason for the suspension.
+    &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:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
     <code class="details" id="list">list(project, filter=None, maxResults=None, pageToken=None, x__xgafv=None)</code>
   <pre>Lists instances under a given project.
 
@@ -112,29 +1342,22 @@
       &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
       &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
       &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
-      &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
-      &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance. Applies only to Second Generation instances.
+      &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+      &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
         &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
         &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
       },
-      &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance. Applies only to Second Generation instances.
+      &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
         &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
         &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
       },
-      &quot;encryptedRootPassword&quot;: &quot;A String&quot;, # For internal usage only. The encrypted password.
       &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
-      &quot;failoverReplica&quot;: { # The name and status of the failover replica. This property is applicable only to Second Generation instances.
+      &quot;failoverReplica&quot;: { # The name and status of the failover replica.
         &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
-        &quot;failoverInstance&quot;: { # Reference to another Cloud SQL instance. # A reference to the failover replica. If specified at instance creation, a failover replica is created for the instance. Currently, the failover replica can only be created in the same region as the primary instance.
-          &quot;name&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance being referenced.
-          &quot;region&quot;: &quot;A String&quot;, # The region of the Cloud SQL instance being referenced.
-        },
-        &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID. This property is applicable only to Second Generation instances.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
       },
       &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
-      &quot;installedVersion&quot;: &quot;A String&quot;, # installed_version stores the current fully resolved database version including minor version such as MySQL_5.6.50
       &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
-      &quot;instanceUid&quot;: &quot;A String&quot;, # Uid of the Cloud SQL instance. Used by Pantheon to check instance is created
       &quot;ipAddresses&quot;: [ # The assigned IP addresses for the instance.
         { # Database instance IP Mapping.
           &quot;ipAddress&quot;: &quot;A String&quot;, # The IP address assigned.
@@ -144,10 +1367,6 @@
       ],
       &quot;ipv6Address&quot;: &quot;A String&quot;, # The IPv6 address assigned to the instance. (Deprecated) This property was applicable only to First Generation instances.
       &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#instance*.
-      &quot;masterInstance&quot;: { # Reference to another Cloud SQL instance. # The reference to the instance which will act as primary in the replication setup.
-        &quot;name&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance being referenced.
-        &quot;region&quot;: &quot;A String&quot;, # The region of the Cloud SQL instance being referenced.
-      },
       &quot;masterInstanceName&quot;: &quot;A String&quot;, # The name of the instance which will act as primary in the replication setup.
       &quot;maxDiskSize&quot;: &quot;A String&quot;, # The maximum disk size of the instance in bytes.
       &quot;name&quot;: &quot;A String&quot;, # Name of the Cloud SQL instance. This does not include the project ID.
@@ -184,12 +1403,6 @@
           &quot;verifyServerCertificate&quot;: True or False, # Whether or not to check the primary instance&#x27;s Common Name value in the certificate that it sends during the SSL handshake.
         },
       },
-      &quot;replicaInstances&quot;: [ # The replicas of the instance.
-        { # Reference to another Cloud SQL instance.
-          &quot;name&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance being referenced.
-          &quot;region&quot;: &quot;A String&quot;, # The region of the Cloud SQL instance being referenced.
-        },
-      ],
       &quot;replicaNames&quot;: [ # The replicas of the instance.
         &quot;A String&quot;,
       ],
@@ -211,6 +1424,7 @@
         &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
         &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
         &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+        &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
         &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
       },
       &quot;serviceAccountEmailAddress&quot;: &quot;A String&quot;, # The service account email address assigned to the instance. This property is read-only.
@@ -220,7 +1434,10 @@
           &quot;domain&quot;: &quot;A String&quot;, # The name of the domain (e.g., mydomain.com).
           &quot;kind&quot;: &quot;A String&quot;, # This is always sql#activeDirectoryConfig.
         },
-        &quot;availabilityType&quot;: &quot;A String&quot;, # Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](/sql/docs/postgres/high-availability).
+        &quot;authorizedGaeApplications&quot;: [ # The App Engine app IDs that can access this instance. (Deprecated) Applied to First Generation instances only.
+          &quot;A String&quot;,
+        ],
+        &quot;availabilityType&quot;: &quot;A String&quot;, # Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](https://cloud.google.com/sql/docs/mysql/high-availability).
         &quot;backupConfiguration&quot;: { # Database instance backup configuration. # The daily backup configuration for the instance.
           &quot;backupRetentionSettings&quot;: { # We currently only support backup retention by specifying the number of backups we will retain. # Backup retention settings.
             &quot;retainedBackups&quot;: 42, # Depending on the value of retention_unit, this is used to determine if a backup needs to be deleted. If retention_unit is &#x27;COUNT&#x27;, we will retain this many backups.
@@ -241,7 +1458,7 @@
         &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: **PD_SSD** (default) or **PD_HDD**.
         &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
           { # Database flags for Cloud SQL instances.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](/sql/docs/mysql/flags) in the Cloud SQL documentation.
+            &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](https://cloud.google.com/sql/docs/mysql/flags) in the Cloud SQL documentation.
             &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to **on** for true and **off** for false. This field must be omitted if the flag doesn&#x27;t take a value.
           },
         ],
@@ -255,7 +1472,7 @@
         ],
         &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
           &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
-          &quot;queryPlansPerMinute&quot;: 42, # Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.
+          &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
           &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
           &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
           &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
@@ -275,6 +1492,7 @@
         },
         &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#settings**.
         &quot;locationPreference&quot;: { # Preferred location. This specifies where a Cloud SQL instance is located. Note that if the preferred location is not available, the instance will be located as close as possible within the region. Only one location may be specified. # The location preference settings. This allows the instance to be located as near as possible to Compute Engine zone for better performance.
+          &quot;followGaeApplication&quot;: &quot;A String&quot;, # The App Engine application to follow, it must be in the same region as the Cloud SQL instance.
           &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#locationPreference**.
           &quot;secondaryZone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone for the secondary/failover (for example: us-central1-a, us-central1-b, etc.). Reserved for future use.
           &quot;zone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone (for example: us-central1-a, us-central1-b, etc.).
@@ -283,7 +1501,7 @@
           &quot;day&quot;: 42, # day of week (1-7), starting on Monday.
           &quot;hour&quot;: 42, # hour of day - 0 to 23.
           &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#maintenanceWindow**.
-          &quot;updateTrack&quot;: &quot;A String&quot;, # Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/admin-api/rest/v1/instance-settings#maintenance-timing-2ndgen).
+          &quot;updateTrack&quot;: &quot;A String&quot;, # Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/instance-settings#maintenance-timing-2ndgen).
         },
         &quot;pricingPlan&quot;: &quot;A String&quot;, # The pricing plan for this instance. This can be either **PER_USE** or **PACKAGE**. Only **PER_USE** is supported for Second Generation instances.
         &quot;replicationType&quot;: &quot;A String&quot;, # The type of replication this instance uses. This can be either **ASYNCHRONOUS** or **SYNCHRONOUS**. (Deprecated) This property was only applicable to First Generation instances.
@@ -314,6 +1532,40 @@
 </div>
 
 <div class="method">
+    <code class="details" id="listServerCas">listServerCas(project, instance, x__xgafv=None)</code>
+  <pre>Lists all of the trusted Certificate Authorities (CAs) for the specified instance. There can be up to three CAs listed: the CA that was used to sign the certificate that is currently in use, a CA that has been added but not yet used to sign a certificate, and a CA used to sign a certificate that has previously rotated out.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Instances ListServerCas response.
+  &quot;activeVersion&quot;: &quot;A String&quot;,
+  &quot;certs&quot;: [ # List of server CA certificates for the instance.
+    { # SslCerts Resource
+      &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+      &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+      &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+      &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+      &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+      &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+      &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+      &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#instancesListServerCas*.
+}</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.
 
@@ -327,4 +1579,1264 @@
     </pre>
 </div>
 
+<div class="method">
+    <code class="details" id="patch">patch(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Updates settings of a Cloud SQL instance. This method supports patch semantics.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A Cloud SQL instance resource.
+  &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
+  &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
+  &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
+    &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
+  },
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
+    &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
+  },
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
+  &quot;failoverReplica&quot;: { # The name and status of the failover replica.
+    &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
+    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
+  },
+  &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
+  &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
+  &quot;ipAddresses&quot;: [ # The assigned IP addresses for the instance.
+    { # Database instance IP Mapping.
+      &quot;ipAddress&quot;: &quot;A String&quot;, # The IP address assigned.
+      &quot;timeToRetire&quot;: &quot;A String&quot;, # The due time for this IP to be retired in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**. This field is only available when the IP is scheduled to be retired.
+      &quot;type&quot;: &quot;A String&quot;, # The type of this IP address. A **PRIMARY** address is a public address that can accept incoming connections. A **PRIVATE** address is a private address that can accept incoming connections. An **OUTGOING** address is the source address of connections originating from the instance, if supported.
+    },
+  ],
+  &quot;ipv6Address&quot;: &quot;A String&quot;, # The IPv6 address assigned to the instance. (Deprecated) This property was applicable only to First Generation instances.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#instance*.
+  &quot;masterInstanceName&quot;: &quot;A String&quot;, # The name of the instance which will act as primary in the replication setup.
+  &quot;maxDiskSize&quot;: &quot;A String&quot;, # The maximum disk size of the instance in bytes.
+  &quot;name&quot;: &quot;A String&quot;, # Name of the Cloud SQL instance. This does not include the project ID.
+  &quot;onPremisesConfiguration&quot;: { # On-premises instance configuration. # Configuration specific to on-premises instances.
+    &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+    &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+    &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
+    &quot;dumpFilePath&quot;: &quot;A String&quot;, # The dump file to create the Cloud SQL replica.
+    &quot;hostPort&quot;: &quot;A String&quot;, # The host and port of the on-premises instance in host:port format
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#onPremisesConfiguration*.
+    &quot;password&quot;: &quot;A String&quot;, # The password for connecting to on-premises instance.
+    &quot;username&quot;: &quot;A String&quot;, # The username for connecting to on-premises instance.
+  },
+  &quot;outOfDiskReport&quot;: { # This message wraps up the information written by out-of-disk detection job. # This field represents the report generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
+    &quot;sqlMinRecommendedIncreaseSizeGb&quot;: 42, # The minimum recommended increase size in GigaBytes This field is consumed by the frontend Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend
+    &quot;sqlOutOfDiskState&quot;: &quot;A String&quot;, # This field represents the state generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
+  },
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL instance. The Google apps domain is prefixed if applicable.
+  &quot;region&quot;: &quot;A String&quot;, # The geographical region. Can be *us-central* (*FIRST_GEN* instances only) *us-central1* (*SECOND_GEN* instances only) *asia-east1* or *europe-west1*. Defaults to *us-central* or *us-central1* depending on the instance type. The region cannot be changed after instance creation.
+  &quot;replicaConfiguration&quot;: { # Read-replica configuration for connecting to the primary instance. # Configuration specific to failover replicas and read replicas.
+    &quot;failoverTarget&quot;: True or False, # Specifies if the replica is the failover target. If the field is set to *true* the replica will be designated as a failover replica. In case the primary instance fails, the replica instance will be promoted as the new primary instance. Only one replica can be specified as failover target, and the replica has to be in different zone with the primary instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#replicaConfiguration*.
+    &quot;mysqlReplicaConfiguration&quot;: { # Read-replica configuration specific to MySQL databases. # MySQL specific configuration when replicating from a MySQL on-premises primary instance. Replication configuration information such as the username, password, certificates, and keys are not stored in the instance metadata.The configuration information is used only to set up the replication connection and is stored by MySQL in a file named *master.info* in the data directory.
+      &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+      &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+      &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
+      &quot;connectRetryInterval&quot;: 42, # Seconds to wait between connect retries. MySQL&#x27;s default is 60 seconds.
+      &quot;dumpFilePath&quot;: &quot;A String&quot;, # Path to a SQL dump file in Google Cloud Storage from which the replica instance is to be created. The URI is in the form gs://bucketName/fileName. Compressed gzip files (.gz) are also supported. Dumps have the binlog co-ordinates from which replication begins. This can be accomplished by setting --master-data to 1 when using mysqldump.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#mysqlReplicaConfiguration**.
+      &quot;masterHeartbeatPeriod&quot;: &quot;A String&quot;, # Interval in milliseconds between replication heartbeats.
+      &quot;password&quot;: &quot;A String&quot;, # The password for the replication connection.
+      &quot;sslCipher&quot;: &quot;A String&quot;, # A list of permissible ciphers to use for SSL encryption.
+      &quot;username&quot;: &quot;A String&quot;, # The username for the replication connection.
+      &quot;verifyServerCertificate&quot;: True or False, # Whether or not to check the primary instance&#x27;s Common Name value in the certificate that it sends during the SSL handshake.
+    },
+  },
+  &quot;replicaNames&quot;: [ # The replicas of the instance.
+    &quot;A String&quot;,
+  ],
+  &quot;rootPassword&quot;: &quot;A String&quot;, # Initial root password. Use only on creation.
+  &quot;satisfiesPzs&quot;: True or False, # The status indicating if instance satisfiesPzs. Reserved for future use.
+  &quot;scheduledMaintenance&quot;: { # Any scheduled maintenancce for this instance. # The start time of any upcoming scheduled maintenance for this instance.
+    &quot;canDefer&quot;: True or False,
+    &quot;canReschedule&quot;: True or False, # If the scheduled maintenance can be rescheduled.
+    &quot;scheduleDeadlineTime&quot;: &quot;A String&quot;, # Maintenance cannot be rescheduled to start beyond this deadline.
+    &quot;startTime&quot;: &quot;A String&quot;, # The start time of any upcoming scheduled maintenance for this instance.
+  },
+  &quot;secondaryGceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the failover instance is currently serving from for a regional instance. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary/failover zone. Reserved for future use.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;serverCaCert&quot;: { # SslCerts Resource # SSL configuration.
+    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+    &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+  },
+  &quot;serviceAccountEmailAddress&quot;: &quot;A String&quot;, # The service account email address assigned to the instance. This property is read-only.
+  &quot;settings&quot;: { # Database instance settings. # The user settings.
+    &quot;activationPolicy&quot;: &quot;A String&quot;, # The activation policy specifies when the instance is activated; it is applicable only when the instance state is RUNNABLE. Valid values: **ALWAYS**: The instance is on, and remains so even in the absence of connection requests. **NEVER**: The instance is off; it is not activated, even if a connection request arrives.
+    &quot;activeDirectoryConfig&quot;: { # Active Directory configuration, relevant only for Cloud SQL for SQL Server. # Active Directory configuration, relevant only for Cloud SQL for SQL Server.
+      &quot;domain&quot;: &quot;A String&quot;, # The name of the domain (e.g., mydomain.com).
+      &quot;kind&quot;: &quot;A String&quot;, # This is always sql#activeDirectoryConfig.
+    },
+    &quot;authorizedGaeApplications&quot;: [ # The App Engine app IDs that can access this instance. (Deprecated) Applied to First Generation instances only.
+      &quot;A String&quot;,
+    ],
+    &quot;availabilityType&quot;: &quot;A String&quot;, # Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](https://cloud.google.com/sql/docs/mysql/high-availability).
+    &quot;backupConfiguration&quot;: { # Database instance backup configuration. # The daily backup configuration for the instance.
+      &quot;backupRetentionSettings&quot;: { # We currently only support backup retention by specifying the number of backups we will retain. # Backup retention settings.
+        &quot;retainedBackups&quot;: 42, # Depending on the value of retention_unit, this is used to determine if a backup needs to be deleted. If retention_unit is &#x27;COUNT&#x27;, we will retain this many backups.
+        &quot;retentionUnit&quot;: &quot;A String&quot;, # The unit that &#x27;retained_backups&#x27; represents.
+      },
+      &quot;binaryLogEnabled&quot;: True or False, # (MySQL only) Whether binary log is enabled. If backup configuration is disabled, binarylog must be disabled as well.
+      &quot;enabled&quot;: True or False, # Whether this configuration is enabled.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupConfiguration**.
+      &quot;location&quot;: &quot;A String&quot;, # Location of the backup
+      &quot;pointInTimeRecoveryEnabled&quot;: True or False, # (Postgres only) Whether point in time recovery is enabled.
+      &quot;replicationLogArchivingEnabled&quot;: True or False, # Reserved for future use.
+      &quot;startTime&quot;: &quot;A String&quot;, # Start time for the daily backup configuration in UTC timezone in the 24 hour format - **HH:MM**.
+      &quot;transactionLogRetentionDays&quot;: 42, # The number of days of transaction logs we retain for point in time restore, from 1-7.
+    },
+    &quot;collation&quot;: &quot;A String&quot;, # The name of server Instance collation.
+    &quot;crashSafeReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether database flags for crash-safe replication are enabled. This property was only applicable to First Generation instances.
+    &quot;dataDiskSizeGb&quot;: &quot;A String&quot;, # The size of data disk, in GB. The data disk size minimum is 10GB.
+    &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: **PD_SSD** (default) or **PD_HDD**.
+    &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
+      { # Database flags for Cloud SQL instances.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](https://cloud.google.com/sql/docs/mysql/flags) in the Cloud SQL documentation.
+        &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to **on** for true and **off** for false. This field must be omitted if the flag doesn&#x27;t take a value.
+      },
+    ],
+    &quot;databaseReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether replication is enabled or not.
+    &quot;denyMaintenancePeriods&quot;: [ # Deny maintenance periods
+      { # Deny maintenance Periods. This specifies a date range during when all CSA rollout will be denied.
+        &quot;endDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; end date. If the year of the end date is empty, the year of the start date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
+        &quot;startDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; start date. If the year of the start date is empty, the year of the end date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
+        &quot;time&quot;: &quot;A String&quot;, # Time in UTC when the &quot;deny maintenance period&quot; starts on start_date and ends on end_date. The time is in format: HH:mm:SS, i.e., 00:00:00
+      },
+    ],
+    &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
+      &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
+      &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
+      &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
+      &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
+      &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
+    },
+    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+      &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: **192.168.100.0/24**).
+        { # An entry for an Access Control list.
+          &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+          &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#aclEntry**.
+          &quot;name&quot;: &quot;A String&quot;, # Optional. A label to identify this entry.
+          &quot;value&quot;: &quot;A String&quot;, # The allowlisted value for the access control list.
+        },
+      ],
+      &quot;ipv4Enabled&quot;: True or False, # Whether the instance is assigned a public IP address or not.
+      &quot;privateNetwork&quot;: &quot;A String&quot;, # The resource link for the VPC network from which the Cloud SQL instance is accessible for private IP. For example, **/projects/myProject/global/networks/default**. This setting can be updated, but it cannot be removed after it is set.
+      &quot;requireSsl&quot;: True or False, # Whether SSL connections over IP are enforced or not.
+    },
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#settings**.
+    &quot;locationPreference&quot;: { # Preferred location. This specifies where a Cloud SQL instance is located. Note that if the preferred location is not available, the instance will be located as close as possible within the region. Only one location may be specified. # The location preference settings. This allows the instance to be located as near as possible to Compute Engine zone for better performance.
+      &quot;followGaeApplication&quot;: &quot;A String&quot;, # The App Engine application to follow, it must be in the same region as the Cloud SQL instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#locationPreference**.
+      &quot;secondaryZone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone for the secondary/failover (for example: us-central1-a, us-central1-b, etc.). Reserved for future use.
+      &quot;zone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone (for example: us-central1-a, us-central1-b, etc.).
+    },
+    &quot;maintenanceWindow&quot;: { # Maintenance window. This specifies when a Cloud SQL instance is restarted for system maintenance purposes. # The maintenance window for this instance. This specifies when the instance can be restarted for maintenance purposes.
+      &quot;day&quot;: 42, # day of week (1-7), starting on Monday.
+      &quot;hour&quot;: 42, # hour of day - 0 to 23.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#maintenanceWindow**.
+      &quot;updateTrack&quot;: &quot;A String&quot;, # Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/instance-settings#maintenance-timing-2ndgen).
+    },
+    &quot;pricingPlan&quot;: &quot;A String&quot;, # The pricing plan for this instance. This can be either **PER_USE** or **PACKAGE**. Only **PER_USE** is supported for Second Generation instances.
+    &quot;replicationType&quot;: &quot;A String&quot;, # The type of replication this instance uses. This can be either **ASYNCHRONOUS** or **SYNCHRONOUS**. (Deprecated) This property was only applicable to First Generation instances.
+    &quot;settingsVersion&quot;: &quot;A String&quot;, # The version of instance settings. This is a required field for update method to make sure concurrent updates are handled properly. During update, use the most recent settingsVersion value for this instance and do not try to update this value.
+    &quot;storageAutoResize&quot;: True or False, # Configuration to increase storage size automatically. The default value is true.
+    &quot;storageAutoResizeLimit&quot;: &quot;A String&quot;, # The maximum size to which storage capacity can be automatically increased. The default value is 0, which specifies that there is no limit.
+    &quot;tier&quot;: &quot;A String&quot;, # The tier (or machine type) for this instance, for example **db-custom-1-3840**.
+    &quot;userLabels&quot;: { # User-provided labels, represented as a dictionary where each label is a single key value pair.
+      &quot;a_key&quot;: &quot;A String&quot;,
+    },
+  },
+  &quot;state&quot;: &quot;A String&quot;, # The current serving state of the Cloud SQL instance. This can be one of the following. *SQL_INSTANCE_STATE_UNSPECIFIED*: The state of the instance is unknown. *RUNNABLE*: The instance is running, or has been stopped by owner. *SUSPENDED*: The instance is not available, for example due to problems with billing. *PENDING_DELETE*: The instance is being deleted. *PENDING_CREATE*: The instance is being created. *MAINTENANCE*: The instance is down for maintenance. *FAILED*: The instance creation failed.
+  &quot;suspensionReason&quot;: [ # If the instance state is SUSPENDED, the reason for the suspension.
+    &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:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="promoteReplica">promoteReplica(project, instance, x__xgafv=None)</code>
+  <pre>Promotes the read replica instance to be a stand-alone Cloud SQL instance. Using this operation might cause your instance to restart.
+
+Args:
+  project: string, ID of the project that contains the read replica. (required)
+  instance: string, Cloud SQL read replica instance name. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="resetSslConfig">resetSslConfig(project, instance, x__xgafv=None)</code>
+  <pre>Deletes all client certificates and generates a new server SSL certificate for the instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="restart">restart(project, instance, x__xgafv=None)</code>
+  <pre>Restarts a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance to be restarted. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="restoreBackup">restoreBackup(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Restores a backup of a Cloud SQL instance. Using this operation might cause your instance to restart.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Database instance restore backup request.
+  &quot;restoreBackupContext&quot;: { # Database instance restore from backup context. Backup context contains source instance id and project id. # Parameters required to perform the restore backup operation.
+    &quot;backupRunId&quot;: &quot;A String&quot;, # The ID of the backup run to restore from.
+    &quot;instanceId&quot;: &quot;A String&quot;, # The ID of the instance that the backup was taken from.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#restoreBackupContext*.
+    &quot;project&quot;: &quot;A String&quot;, # The full project ID of the source instance.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="rotateServerCa">rotateServerCa(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Rotates the server certificate to one signed by the Certificate Authority (CA) version previously added with the addServerCA method.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Rotate server CA request.
+  &quot;rotateServerCaContext&quot;: { # Instance rotate server CA context. # Contains details about the rotate server CA operation.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#rotateServerCaContext*.
+    &quot;nextVersion&quot;: &quot;A String&quot;, # The fingerprint of the next version to be rotated to. If left unspecified, will be rotated to the most recently added server CA version.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="startReplica">startReplica(project, instance, x__xgafv=None)</code>
+  <pre>Starts the replication in the read replica instance.
+
+Args:
+  project: string, ID of the project that contains the read replica. (required)
+  instance: string, Cloud SQL read replica instance name. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="stopReplica">stopReplica(project, instance, x__xgafv=None)</code>
+  <pre>Stops the replication in the read replica instance.
+
+Args:
+  project: string, ID of the project that contains the read replica. (required)
+  instance: string, Cloud SQL read replica instance name. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="truncateLog">truncateLog(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Truncate MySQL general and slow query log tables MySQL only.
+
+Args:
+  project: string, Project ID of the Cloud SQL project. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # Instance truncate log request.
+  &quot;truncateLogContext&quot;: { # Database Instance truncate log context. # Contains details about the truncate log operation.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#truncateLogContext*.
+    &quot;logType&quot;: &quot;A String&quot;, # The type of log to truncate. Valid values are *MYSQL_GENERAL_TABLE* and *MYSQL_SLOW_TABLE*.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="update">update(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Updates settings of a Cloud SQL instance. Using this operation might cause your instance to restart.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A Cloud SQL instance resource.
+  &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
+  &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
+  &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
+    &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
+  },
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
+    &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
+  },
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
+  &quot;failoverReplica&quot;: { # The name and status of the failover replica.
+    &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
+    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
+  },
+  &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
+  &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
+  &quot;ipAddresses&quot;: [ # The assigned IP addresses for the instance.
+    { # Database instance IP Mapping.
+      &quot;ipAddress&quot;: &quot;A String&quot;, # The IP address assigned.
+      &quot;timeToRetire&quot;: &quot;A String&quot;, # The due time for this IP to be retired in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**. This field is only available when the IP is scheduled to be retired.
+      &quot;type&quot;: &quot;A String&quot;, # The type of this IP address. A **PRIMARY** address is a public address that can accept incoming connections. A **PRIVATE** address is a private address that can accept incoming connections. An **OUTGOING** address is the source address of connections originating from the instance, if supported.
+    },
+  ],
+  &quot;ipv6Address&quot;: &quot;A String&quot;, # The IPv6 address assigned to the instance. (Deprecated) This property was applicable only to First Generation instances.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#instance*.
+  &quot;masterInstanceName&quot;: &quot;A String&quot;, # The name of the instance which will act as primary in the replication setup.
+  &quot;maxDiskSize&quot;: &quot;A String&quot;, # The maximum disk size of the instance in bytes.
+  &quot;name&quot;: &quot;A String&quot;, # Name of the Cloud SQL instance. This does not include the project ID.
+  &quot;onPremisesConfiguration&quot;: { # On-premises instance configuration. # Configuration specific to on-premises instances.
+    &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+    &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+    &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
+    &quot;dumpFilePath&quot;: &quot;A String&quot;, # The dump file to create the Cloud SQL replica.
+    &quot;hostPort&quot;: &quot;A String&quot;, # The host and port of the on-premises instance in host:port format
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#onPremisesConfiguration*.
+    &quot;password&quot;: &quot;A String&quot;, # The password for connecting to on-premises instance.
+    &quot;username&quot;: &quot;A String&quot;, # The username for connecting to on-premises instance.
+  },
+  &quot;outOfDiskReport&quot;: { # This message wraps up the information written by out-of-disk detection job. # This field represents the report generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
+    &quot;sqlMinRecommendedIncreaseSizeGb&quot;: 42, # The minimum recommended increase size in GigaBytes This field is consumed by the frontend Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend
+    &quot;sqlOutOfDiskState&quot;: &quot;A String&quot;, # This field represents the state generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
+  },
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL instance. The Google apps domain is prefixed if applicable.
+  &quot;region&quot;: &quot;A String&quot;, # The geographical region. Can be *us-central* (*FIRST_GEN* instances only) *us-central1* (*SECOND_GEN* instances only) *asia-east1* or *europe-west1*. Defaults to *us-central* or *us-central1* depending on the instance type. The region cannot be changed after instance creation.
+  &quot;replicaConfiguration&quot;: { # Read-replica configuration for connecting to the primary instance. # Configuration specific to failover replicas and read replicas.
+    &quot;failoverTarget&quot;: True or False, # Specifies if the replica is the failover target. If the field is set to *true* the replica will be designated as a failover replica. In case the primary instance fails, the replica instance will be promoted as the new primary instance. Only one replica can be specified as failover target, and the replica has to be in different zone with the primary instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#replicaConfiguration*.
+    &quot;mysqlReplicaConfiguration&quot;: { # Read-replica configuration specific to MySQL databases. # MySQL specific configuration when replicating from a MySQL on-premises primary instance. Replication configuration information such as the username, password, certificates, and keys are not stored in the instance metadata.The configuration information is used only to set up the replication connection and is stored by MySQL in a file named *master.info* in the data directory.
+      &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
+      &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
+      &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
+      &quot;connectRetryInterval&quot;: 42, # Seconds to wait between connect retries. MySQL&#x27;s default is 60 seconds.
+      &quot;dumpFilePath&quot;: &quot;A String&quot;, # Path to a SQL dump file in Google Cloud Storage from which the replica instance is to be created. The URI is in the form gs://bucketName/fileName. Compressed gzip files (.gz) are also supported. Dumps have the binlog co-ordinates from which replication begins. This can be accomplished by setting --master-data to 1 when using mysqldump.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#mysqlReplicaConfiguration**.
+      &quot;masterHeartbeatPeriod&quot;: &quot;A String&quot;, # Interval in milliseconds between replication heartbeats.
+      &quot;password&quot;: &quot;A String&quot;, # The password for the replication connection.
+      &quot;sslCipher&quot;: &quot;A String&quot;, # A list of permissible ciphers to use for SSL encryption.
+      &quot;username&quot;: &quot;A String&quot;, # The username for the replication connection.
+      &quot;verifyServerCertificate&quot;: True or False, # Whether or not to check the primary instance&#x27;s Common Name value in the certificate that it sends during the SSL handshake.
+    },
+  },
+  &quot;replicaNames&quot;: [ # The replicas of the instance.
+    &quot;A String&quot;,
+  ],
+  &quot;rootPassword&quot;: &quot;A String&quot;, # Initial root password. Use only on creation.
+  &quot;satisfiesPzs&quot;: True or False, # The status indicating if instance satisfiesPzs. Reserved for future use.
+  &quot;scheduledMaintenance&quot;: { # Any scheduled maintenancce for this instance. # The start time of any upcoming scheduled maintenance for this instance.
+    &quot;canDefer&quot;: True or False,
+    &quot;canReschedule&quot;: True or False, # If the scheduled maintenance can be rescheduled.
+    &quot;scheduleDeadlineTime&quot;: &quot;A String&quot;, # Maintenance cannot be rescheduled to start beyond this deadline.
+    &quot;startTime&quot;: &quot;A String&quot;, # The start time of any upcoming scheduled maintenance for this instance.
+  },
+  &quot;secondaryGceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the failover instance is currently serving from for a regional instance. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary/failover zone. Reserved for future use.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;serverCaCert&quot;: { # SslCerts Resource # SSL configuration.
+    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+    &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+  },
+  &quot;serviceAccountEmailAddress&quot;: &quot;A String&quot;, # The service account email address assigned to the instance. This property is read-only.
+  &quot;settings&quot;: { # Database instance settings. # The user settings.
+    &quot;activationPolicy&quot;: &quot;A String&quot;, # The activation policy specifies when the instance is activated; it is applicable only when the instance state is RUNNABLE. Valid values: **ALWAYS**: The instance is on, and remains so even in the absence of connection requests. **NEVER**: The instance is off; it is not activated, even if a connection request arrives.
+    &quot;activeDirectoryConfig&quot;: { # Active Directory configuration, relevant only for Cloud SQL for SQL Server. # Active Directory configuration, relevant only for Cloud SQL for SQL Server.
+      &quot;domain&quot;: &quot;A String&quot;, # The name of the domain (e.g., mydomain.com).
+      &quot;kind&quot;: &quot;A String&quot;, # This is always sql#activeDirectoryConfig.
+    },
+    &quot;authorizedGaeApplications&quot;: [ # The App Engine app IDs that can access this instance. (Deprecated) Applied to First Generation instances only.
+      &quot;A String&quot;,
+    ],
+    &quot;availabilityType&quot;: &quot;A String&quot;, # Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](https://cloud.google.com/sql/docs/mysql/high-availability).
+    &quot;backupConfiguration&quot;: { # Database instance backup configuration. # The daily backup configuration for the instance.
+      &quot;backupRetentionSettings&quot;: { # We currently only support backup retention by specifying the number of backups we will retain. # Backup retention settings.
+        &quot;retainedBackups&quot;: 42, # Depending on the value of retention_unit, this is used to determine if a backup needs to be deleted. If retention_unit is &#x27;COUNT&#x27;, we will retain this many backups.
+        &quot;retentionUnit&quot;: &quot;A String&quot;, # The unit that &#x27;retained_backups&#x27; represents.
+      },
+      &quot;binaryLogEnabled&quot;: True or False, # (MySQL only) Whether binary log is enabled. If backup configuration is disabled, binarylog must be disabled as well.
+      &quot;enabled&quot;: True or False, # Whether this configuration is enabled.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupConfiguration**.
+      &quot;location&quot;: &quot;A String&quot;, # Location of the backup
+      &quot;pointInTimeRecoveryEnabled&quot;: True or False, # (Postgres only) Whether point in time recovery is enabled.
+      &quot;replicationLogArchivingEnabled&quot;: True or False, # Reserved for future use.
+      &quot;startTime&quot;: &quot;A String&quot;, # Start time for the daily backup configuration in UTC timezone in the 24 hour format - **HH:MM**.
+      &quot;transactionLogRetentionDays&quot;: 42, # The number of days of transaction logs we retain for point in time restore, from 1-7.
+    },
+    &quot;collation&quot;: &quot;A String&quot;, # The name of server Instance collation.
+    &quot;crashSafeReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether database flags for crash-safe replication are enabled. This property was only applicable to First Generation instances.
+    &quot;dataDiskSizeGb&quot;: &quot;A String&quot;, # The size of data disk, in GB. The data disk size minimum is 10GB.
+    &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: **PD_SSD** (default) or **PD_HDD**.
+    &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
+      { # Database flags for Cloud SQL instances.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](https://cloud.google.com/sql/docs/mysql/flags) in the Cloud SQL documentation.
+        &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to **on** for true and **off** for false. This field must be omitted if the flag doesn&#x27;t take a value.
+      },
+    ],
+    &quot;databaseReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether replication is enabled or not.
+    &quot;denyMaintenancePeriods&quot;: [ # Deny maintenance periods
+      { # Deny maintenance Periods. This specifies a date range during when all CSA rollout will be denied.
+        &quot;endDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; end date. If the year of the end date is empty, the year of the start date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
+        &quot;startDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; start date. If the year of the start date is empty, the year of the end date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
+        &quot;time&quot;: &quot;A String&quot;, # Time in UTC when the &quot;deny maintenance period&quot; starts on start_date and ends on end_date. The time is in format: HH:mm:SS, i.e., 00:00:00
+      },
+    ],
+    &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
+      &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
+      &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
+      &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
+      &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
+      &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
+    },
+    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+      &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: **192.168.100.0/24**).
+        { # An entry for an Access Control list.
+          &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+          &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#aclEntry**.
+          &quot;name&quot;: &quot;A String&quot;, # Optional. A label to identify this entry.
+          &quot;value&quot;: &quot;A String&quot;, # The allowlisted value for the access control list.
+        },
+      ],
+      &quot;ipv4Enabled&quot;: True or False, # Whether the instance is assigned a public IP address or not.
+      &quot;privateNetwork&quot;: &quot;A String&quot;, # The resource link for the VPC network from which the Cloud SQL instance is accessible for private IP. For example, **/projects/myProject/global/networks/default**. This setting can be updated, but it cannot be removed after it is set.
+      &quot;requireSsl&quot;: True or False, # Whether SSL connections over IP are enforced or not.
+    },
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#settings**.
+    &quot;locationPreference&quot;: { # Preferred location. This specifies where a Cloud SQL instance is located. Note that if the preferred location is not available, the instance will be located as close as possible within the region. Only one location may be specified. # The location preference settings. This allows the instance to be located as near as possible to Compute Engine zone for better performance.
+      &quot;followGaeApplication&quot;: &quot;A String&quot;, # The App Engine application to follow, it must be in the same region as the Cloud SQL instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#locationPreference**.
+      &quot;secondaryZone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone for the secondary/failover (for example: us-central1-a, us-central1-b, etc.). Reserved for future use.
+      &quot;zone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone (for example: us-central1-a, us-central1-b, etc.).
+    },
+    &quot;maintenanceWindow&quot;: { # Maintenance window. This specifies when a Cloud SQL instance is restarted for system maintenance purposes. # The maintenance window for this instance. This specifies when the instance can be restarted for maintenance purposes.
+      &quot;day&quot;: 42, # day of week (1-7), starting on Monday.
+      &quot;hour&quot;: 42, # hour of day - 0 to 23.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#maintenanceWindow**.
+      &quot;updateTrack&quot;: &quot;A String&quot;, # Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/instance-settings#maintenance-timing-2ndgen).
+    },
+    &quot;pricingPlan&quot;: &quot;A String&quot;, # The pricing plan for this instance. This can be either **PER_USE** or **PACKAGE**. Only **PER_USE** is supported for Second Generation instances.
+    &quot;replicationType&quot;: &quot;A String&quot;, # The type of replication this instance uses. This can be either **ASYNCHRONOUS** or **SYNCHRONOUS**. (Deprecated) This property was only applicable to First Generation instances.
+    &quot;settingsVersion&quot;: &quot;A String&quot;, # The version of instance settings. This is a required field for update method to make sure concurrent updates are handled properly. During update, use the most recent settingsVersion value for this instance and do not try to update this value.
+    &quot;storageAutoResize&quot;: True or False, # Configuration to increase storage size automatically. The default value is true.
+    &quot;storageAutoResizeLimit&quot;: &quot;A String&quot;, # The maximum size to which storage capacity can be automatically increased. The default value is 0, which specifies that there is no limit.
+    &quot;tier&quot;: &quot;A String&quot;, # The tier (or machine type) for this instance, for example **db-custom-1-3840**.
+    &quot;userLabels&quot;: { # User-provided labels, represented as a dictionary where each label is a single key value pair.
+      &quot;a_key&quot;: &quot;A String&quot;,
+    },
+  },
+  &quot;state&quot;: &quot;A String&quot;, # The current serving state of the Cloud SQL instance. This can be one of the following. *SQL_INSTANCE_STATE_UNSPECIFIED*: The state of the instance is unknown. *RUNNABLE*: The instance is running, or has been stopped by owner. *SUSPENDED*: The instance is not available, for example due to problems with billing. *PENDING_DELETE*: The instance is being deleted. *PENDING_CREATE*: The instance is being created. *MAINTENANCE*: The instance is down for maintenance. *FAILED*: The instance creation failed.
+  &quot;suspensionReason&quot;: [ # If the instance state is SUSPENDED, the reason for the suspension.
+    &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:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
 </body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1.operations.html b/docs/dyn/sqladmin_v1.operations.html
new file mode 100644
index 0000000..291c896
--- /dev/null
+++ b/docs/dyn/sqladmin_v1.operations.html
@@ -0,0 +1,289 @@
+<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="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.operations.html">operations</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="#get">get(project, operation, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves an instance operation that has been performed on an instance.</p>
+<p class="toc_element">
+  <code><a href="#list">list(project, instance=None, maxResults=None, pageToken=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists all instance operations that have been performed on the given Cloud SQL instance in the reverse chronological order of the start time.</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>
+<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="get">get(project, operation, x__xgafv=None)</code>
+  <pre>Retrieves an instance operation that has been performed on an instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  operation: string, Instance operation ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(project, instance=None, maxResults=None, pageToken=None, x__xgafv=None)</code>
+  <pre>Lists all instance operations that have been performed on the given Cloud SQL instance in the reverse chronological order of the start time.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID.
+  maxResults: integer, Maximum number of operations per response.
+  pageToken: string, A previously-returned page token representing part of the larger set of results to view.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Operations list response.
+  &quot;items&quot;: [ # List of operation resources.
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+      &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+        &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+      },
+      &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+      &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+        &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+          { # Database instance operation error.
+            &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+            &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+            &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+          },
+        ],
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+      },
+      &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+        &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+          &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+        },
+        &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+          &quot;A String&quot;,
+        ],
+        &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+        &quot;offload&quot;: True or False, # Option for export offload.
+        &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+          &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+            &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+          },
+          &quot;schemaOnly&quot;: True or False, # Export only schemas.
+          &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+            &quot;A String&quot;,
+          ],
+        },
+        &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+      },
+      &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+        &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+          &quot;encryptionOptions&quot;: {
+            &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+            &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+            &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+          },
+        },
+        &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+          &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+            &quot;A String&quot;,
+          ],
+          &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+        },
+        &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+        &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+        &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+        &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+      },
+      &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+      &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+      &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+      &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+      &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+      &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+      &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+      &quot;targetLink&quot;: &quot;A String&quot;,
+      &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+      &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#operationsList*.
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of 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>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1.projects.instances.html b/docs/dyn/sqladmin_v1.projects.instances.html
index f0c21d3..e84b557 100644
--- a/docs/dyn/sqladmin_v1.projects.instances.html
+++ b/docs/dyn/sqladmin_v1.projects.instances.html
@@ -75,22 +75,17 @@
 <h1><a href="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.projects.html">projects</a> . <a href="sqladmin_v1.projects.instances.html">instances</a></h1>
 <h2>Instance Methods</h2>
 <p class="toc_element">
-  <code><a href="sqladmin_v1.projects.instances.createEphemeral.html">createEphemeral()</a></code>
-</p>
-<p class="firstline">Returns the createEphemeral 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="#generateEphemeralCert">generateEphemeralCert(project, instance, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.</p>
+  <code><a href="#rescheduleMaintenance">rescheduleMaintenance(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Reschedules the maintenance on the given instance.</p>
 <p class="toc_element">
-  <code><a href="#get">get(project, instance, x__xgafv=None)</a></code></p>
-<p class="firstline">Retrieves a resource containing information about a Cloud SQL instance.</p>
+  <code><a href="#startExternalSync">startExternalSync(project, instance, skipVerification=None, syncMode=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Start External primary instance migration.</p>
 <p class="toc_element">
-  <code><a href="#getConnectSettings">getConnectSettings(project, instance, readTime=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Retrieves connect settings about a Cloud SQL instance.</p>
+  <code><a href="#verifyExternalSyncSettings">verifyExternalSyncSettings(project, instance, syncMode=None, verifyConnectionOnly=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Verify External primary instance external sync settings.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -98,19 +93,20 @@
 </div>
 
 <div class="method">
-    <code class="details" id="generateEphemeralCert">generateEphemeralCert(project, instance, body=None, x__xgafv=None)</code>
-  <pre>Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.
+    <code class="details" id="rescheduleMaintenance">rescheduleMaintenance(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Reschedules the maintenance on the given instance.
 
 Args:
-  project: string, Project ID of the project that contains the instance. (required)
+  project: string, ID of the project that contains the instance. (required)
   instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
   body: object, The request body.
     The object takes the form of:
 
-{ # Ephemeral certificate creation request.
-  &quot;access_token&quot;: &quot;A String&quot;, # Optional. Access token to include in the signed certificate.
-  &quot;public_key&quot;: &quot;A String&quot;, # PEM encoded public key to include in the signed certificate.
-  &quot;readTime&quot;: &quot;A String&quot;, # Optional. Optional snapshot read timestamp to trade freshness for performance.
+{ # Reschedule options for maintenance windows.
+  &quot;reschedule&quot;: { # Required. The type of the reschedule the user wants.
+    &quot;rescheduleType&quot;: &quot;A String&quot;, # Required. The type of the reschedule.
+    &quot;scheduleTime&quot;: &quot;A String&quot;, # Optional. Timestamp when the maintenance shall be rescheduled to if reschedule_type=SPECIFIC_TIME, in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
+  },
 }
 
   x__xgafv: string, V1 error format.
@@ -121,27 +117,90 @@
 Returns:
   An object of the form:
 
-    { # Ephemeral certificate creation request.
-  &quot;ephemeralCert&quot;: { # SslCerts Resource # Generated cert
-    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
-    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
-    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
-    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
-    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
-    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
-    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
-    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
   },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
 }</pre>
 </div>
 
 <div class="method">
-    <code class="details" id="get">get(project, instance, x__xgafv=None)</code>
-  <pre>Retrieves a resource containing information about a Cloud SQL instance.
+    <code class="details" id="startExternalSync">startExternalSync(project, instance, skipVerification=None, syncMode=None, x__xgafv=None)</code>
+  <pre>Start External primary instance migration.
 
 Args:
-  project: string, Project ID of the project that contains the instance. (required)
-  instance: string, Database instance ID. This does not include the project ID. (required)
+  project: string, ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  skipVerification: boolean, Whether to skip the verification step (VESS).
+  syncMode: string, External sync mode.
+    Allowed values
+      EXTERNAL_SYNC_MODE_UNSPECIFIED - Unknown external sync mode, will be defaulted to ONLINE mode
+      ONLINE - Online external sync will set up replication after initial data external sync
+      OFFLINE - Offline external sync only dumps and loads a one-time snapshot of the primary instance&#x27;s data
   x__xgafv: string, V1 error format.
     Allowed values
       1 - v1 error format
@@ -150,208 +209,90 @@
 Returns:
   An object of the form:
 
-    { # A Cloud SQL instance resource.
-  &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
-  &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
-  &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
-  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
-  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance. Applies only to Second Generation instances.
-    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionConfiguration**.
-    &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
   },
-  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance. Applies only to Second Generation instances.
-    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#diskEncryptionStatus**.
-    &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
-  },
-  &quot;encryptedRootPassword&quot;: &quot;A String&quot;, # For internal usage only. The encrypted password.
-  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
-  &quot;failoverReplica&quot;: { # The name and status of the failover replica. This property is applicable only to Second Generation instances.
-    &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
-    &quot;failoverInstance&quot;: { # Reference to another Cloud SQL instance. # A reference to the failover replica. If specified at instance creation, a failover replica is created for the instance. Currently, the failover replica can only be created in the same region as the primary instance.
-      &quot;name&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance being referenced.
-      &quot;region&quot;: &quot;A String&quot;, # The region of the Cloud SQL instance being referenced.
-    },
-    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID. This property is applicable only to Second Generation instances.
-  },
-  &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
-  &quot;installedVersion&quot;: &quot;A String&quot;, # installed_version stores the current fully resolved database version including minor version such as MySQL_5.6.50
-  &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
-  &quot;instanceUid&quot;: &quot;A String&quot;, # Uid of the Cloud SQL instance. Used by Pantheon to check instance is created
-  &quot;ipAddresses&quot;: [ # The assigned IP addresses for the instance.
-    { # Database instance IP Mapping.
-      &quot;ipAddress&quot;: &quot;A String&quot;, # The IP address assigned.
-      &quot;timeToRetire&quot;: &quot;A String&quot;, # The due time for this IP to be retired in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**. This field is only available when the IP is scheduled to be retired.
-      &quot;type&quot;: &quot;A String&quot;, # The type of this IP address. A **PRIMARY** address is a public address that can accept incoming connections. A **PRIVATE** address is a private address that can accept incoming connections. An **OUTGOING** address is the source address of connections originating from the instance, if supported.
-    },
-  ],
-  &quot;ipv6Address&quot;: &quot;A String&quot;, # The IPv6 address assigned to the instance. (Deprecated) This property was applicable only to First Generation instances.
-  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#instance*.
-  &quot;masterInstance&quot;: { # Reference to another Cloud SQL instance. # The reference to the instance which will act as primary in the replication setup.
-    &quot;name&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance being referenced.
-    &quot;region&quot;: &quot;A String&quot;, # The region of the Cloud SQL instance being referenced.
-  },
-  &quot;masterInstanceName&quot;: &quot;A String&quot;, # The name of the instance which will act as primary in the replication setup.
-  &quot;maxDiskSize&quot;: &quot;A String&quot;, # The maximum disk size of the instance in bytes.
-  &quot;name&quot;: &quot;A String&quot;, # Name of the Cloud SQL instance. This does not include the project ID.
-  &quot;onPremisesConfiguration&quot;: { # On-premises instance configuration. # Configuration specific to on-premises instances.
-    &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
-    &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
-    &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
-    &quot;dumpFilePath&quot;: &quot;A String&quot;, # The dump file to create the Cloud SQL replica.
-    &quot;hostPort&quot;: &quot;A String&quot;, # The host and port of the on-premises instance in host:port format
-    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#onPremisesConfiguration*.
-    &quot;password&quot;: &quot;A String&quot;, # The password for connecting to on-premises instance.
-    &quot;username&quot;: &quot;A String&quot;, # The username for connecting to on-premises instance.
-  },
-  &quot;outOfDiskReport&quot;: { # This message wraps up the information written by out-of-disk detection job. # This field represents the report generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
-    &quot;sqlMinRecommendedIncreaseSizeGb&quot;: 42, # The minimum recommended increase size in GigaBytes This field is consumed by the frontend Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend
-    &quot;sqlOutOfDiskState&quot;: &quot;A String&quot;, # This field represents the state generated by the proactive database wellness job for OutOfDisk issues. Writers: -- the proactive database wellness job for OOD. Readers: -- the Pantheon frontend -- the proactive database wellness job
-  },
-  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL instance. The Google apps domain is prefixed if applicable.
-  &quot;region&quot;: &quot;A String&quot;, # The geographical region. Can be *us-central* (*FIRST_GEN* instances only) *us-central1* (*SECOND_GEN* instances only) *asia-east1* or *europe-west1*. Defaults to *us-central* or *us-central1* depending on the instance type. The region cannot be changed after instance creation.
-  &quot;replicaConfiguration&quot;: { # Read-replica configuration for connecting to the primary instance. # Configuration specific to failover replicas and read replicas.
-    &quot;failoverTarget&quot;: True or False, # Specifies if the replica is the failover target. If the field is set to *true* the replica will be designated as a failover replica. In case the primary instance fails, the replica instance will be promoted as the new primary instance. Only one replica can be specified as failover target, and the replica has to be in different zone with the primary instance.
-    &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#replicaConfiguration*.
-    &quot;mysqlReplicaConfiguration&quot;: { # Read-replica configuration specific to MySQL databases. # MySQL specific configuration when replicating from a MySQL on-premises primary instance. Replication configuration information such as the username, password, certificates, and keys are not stored in the instance metadata.The configuration information is used only to set up the replication connection and is stored by MySQL in a file named *master.info* in the data directory.
-      &quot;caCertificate&quot;: &quot;A String&quot;, # PEM representation of the trusted CA&#x27;s x509 certificate.
-      &quot;clientCertificate&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s x509 certificate.
-      &quot;clientKey&quot;: &quot;A String&quot;, # PEM representation of the replica&#x27;s private key. The corresponsing public key is encoded in the client&#x27;s certificate.
-      &quot;connectRetryInterval&quot;: 42, # Seconds to wait between connect retries. MySQL&#x27;s default is 60 seconds.
-      &quot;dumpFilePath&quot;: &quot;A String&quot;, # Path to a SQL dump file in Google Cloud Storage from which the replica instance is to be created. The URI is in the form gs://bucketName/fileName. Compressed gzip files (.gz) are also supported. Dumps have the binlog co-ordinates from which replication begins. This can be accomplished by setting --master-data to 1 when using mysqldump.
-      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#mysqlReplicaConfiguration**.
-      &quot;masterHeartbeatPeriod&quot;: &quot;A String&quot;, # Interval in milliseconds between replication heartbeats.
-      &quot;password&quot;: &quot;A String&quot;, # The password for the replication connection.
-      &quot;sslCipher&quot;: &quot;A String&quot;, # A list of permissible ciphers to use for SSL encryption.
-      &quot;username&quot;: &quot;A String&quot;, # The username for the replication connection.
-      &quot;verifyServerCertificate&quot;: True or False, # Whether or not to check the primary instance&#x27;s Common Name value in the certificate that it sends during the SSL handshake.
-    },
-  },
-  &quot;replicaInstances&quot;: [ # The replicas of the instance.
-    { # Reference to another Cloud SQL instance.
-      &quot;name&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance being referenced.
-      &quot;region&quot;: &quot;A String&quot;, # The region of the Cloud SQL instance being referenced.
-    },
-  ],
-  &quot;replicaNames&quot;: [ # The replicas of the instance.
-    &quot;A String&quot;,
-  ],
-  &quot;rootPassword&quot;: &quot;A String&quot;, # Initial root password. Use only on creation.
-  &quot;satisfiesPzs&quot;: True or False, # The status indicating if instance satisfiesPzs. Reserved for future use.
-  &quot;scheduledMaintenance&quot;: { # Any scheduled maintenancce for this instance. # The start time of any upcoming scheduled maintenance for this instance.
-    &quot;canDefer&quot;: True or False,
-    &quot;canReschedule&quot;: True or False, # If the scheduled maintenance can be rescheduled.
-    &quot;scheduleDeadlineTime&quot;: &quot;A String&quot;, # Maintenance cannot be rescheduled to start beyond this deadline.
-    &quot;startTime&quot;: &quot;A String&quot;, # The start time of any upcoming scheduled maintenance for this instance.
-  },
-  &quot;secondaryGceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the failover instance is currently serving from for a regional instance. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary/failover zone. Reserved for future use.
-  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
-  &quot;serverCaCert&quot;: { # SslCerts Resource # SSL configuration.
-    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
-    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
-    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
-    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
-    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
-    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
-    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
-    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
-  },
-  &quot;serviceAccountEmailAddress&quot;: &quot;A String&quot;, # The service account email address assigned to the instance. This property is read-only.
-  &quot;settings&quot;: { # Database instance settings. # The user settings.
-    &quot;activationPolicy&quot;: &quot;A String&quot;, # The activation policy specifies when the instance is activated; it is applicable only when the instance state is RUNNABLE. Valid values: **ALWAYS**: The instance is on, and remains so even in the absence of connection requests. **NEVER**: The instance is off; it is not activated, even if a connection request arrives.
-    &quot;activeDirectoryConfig&quot;: { # Active Directory configuration, relevant only for Cloud SQL for SQL Server. # Active Directory configuration, relevant only for Cloud SQL for SQL Server.
-      &quot;domain&quot;: &quot;A String&quot;, # The name of the domain (e.g., mydomain.com).
-      &quot;kind&quot;: &quot;A String&quot;, # This is always sql#activeDirectoryConfig.
-    },
-    &quot;availabilityType&quot;: &quot;A String&quot;, # Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](/sql/docs/postgres/high-availability).
-    &quot;backupConfiguration&quot;: { # Database instance backup configuration. # The daily backup configuration for the instance.
-      &quot;backupRetentionSettings&quot;: { # We currently only support backup retention by specifying the number of backups we will retain. # Backup retention settings.
-        &quot;retainedBackups&quot;: 42, # Depending on the value of retention_unit, this is used to determine if a backup needs to be deleted. If retention_unit is &#x27;COUNT&#x27;, we will retain this many backups.
-        &quot;retentionUnit&quot;: &quot;A String&quot;, # The unit that &#x27;retained_backups&#x27; represents.
-      },
-      &quot;binaryLogEnabled&quot;: True or False, # (MySQL only) Whether binary log is enabled. If backup configuration is disabled, binarylog must be disabled as well.
-      &quot;enabled&quot;: True or False, # Whether this configuration is enabled.
-      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupConfiguration**.
-      &quot;location&quot;: &quot;A String&quot;, # Location of the backup
-      &quot;pointInTimeRecoveryEnabled&quot;: True or False, # (Postgres only) Whether point in time recovery is enabled.
-      &quot;replicationLogArchivingEnabled&quot;: True or False, # Reserved for future use.
-      &quot;startTime&quot;: &quot;A String&quot;, # Start time for the daily backup configuration in UTC timezone in the 24 hour format - **HH:MM**.
-      &quot;transactionLogRetentionDays&quot;: 42, # The number of days of transaction logs we retain for point in time restore, from 1-7.
-    },
-    &quot;collation&quot;: &quot;A String&quot;, # The name of server Instance collation.
-    &quot;crashSafeReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether database flags for crash-safe replication are enabled. This property was only applicable to First Generation instances.
-    &quot;dataDiskSizeGb&quot;: &quot;A String&quot;, # The size of data disk, in GB. The data disk size minimum is 10GB.
-    &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: **PD_SSD** (default) or **PD_HDD**.
-    &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
-      { # Database flags for Cloud SQL instances.
-        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](/sql/docs/mysql/flags) in the Cloud SQL documentation.
-        &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to **on** for true and **off** for false. This field must be omitted if the flag doesn&#x27;t take a value.
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
       },
     ],
-    &quot;databaseReplicationEnabled&quot;: True or False, # Configuration specific to read replica instances. Indicates whether replication is enabled or not.
-    &quot;denyMaintenancePeriods&quot;: [ # Deny maintenance periods
-      { # Deny maintenance Periods. This specifies a date range during when all CSA rollout will be denied.
-        &quot;endDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; end date. If the year of the end date is empty, the year of the start date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
-        &quot;startDate&quot;: &quot;A String&quot;, # &quot;deny maintenance period&quot; start date. If the year of the start date is empty, the year of the end date also must be empty. In this case, it means the no maintenance interval recurs every year. The date is in format yyyy-mm-dd i.e., 2020-11-01, or mm-dd, i.e., 11-01
-        &quot;time&quot;: &quot;A String&quot;, # Time in UTC when the &quot;deny maintenance period&quot; starts on start_date and ends on end_date. The time is in format: HH:mm:SS, i.e., 00:00:00
-      },
-    ],
-    &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
-      &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
-      &quot;queryPlansPerMinute&quot;: 42, # Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.
-      &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
-      &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
-      &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
     },
-    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
-      &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: **192.168.100.0/24**).
-        { # An entry for an Access Control list.
-          &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
-          &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#aclEntry**.
-          &quot;name&quot;: &quot;A String&quot;, # Optional. A label to identify this entry.
-          &quot;value&quot;: &quot;A String&quot;, # The allowlisted value for the access control list.
-        },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
       ],
-      &quot;ipv4Enabled&quot;: True or False, # Whether the instance is assigned a public IP address or not.
-      &quot;privateNetwork&quot;: &quot;A String&quot;, # The resource link for the VPC network from which the Cloud SQL instance is accessible for private IP. For example, **/projects/myProject/global/networks/default**. This setting can be updated, but it cannot be removed after it is set.
-      &quot;requireSsl&quot;: True or False, # Whether SSL connections over IP are enforced or not.
     },
-    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#settings**.
-    &quot;locationPreference&quot;: { # Preferred location. This specifies where a Cloud SQL instance is located. Note that if the preferred location is not available, the instance will be located as close as possible within the region. Only one location may be specified. # The location preference settings. This allows the instance to be located as near as possible to Compute Engine zone for better performance.
-      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#locationPreference**.
-      &quot;secondaryZone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone for the secondary/failover (for example: us-central1-a, us-central1-b, etc.). Reserved for future use.
-      &quot;zone&quot;: &quot;A String&quot;, # The preferred Compute Engine zone (for example: us-central1-a, us-central1-b, etc.).
-    },
-    &quot;maintenanceWindow&quot;: { # Maintenance window. This specifies when a Cloud SQL instance is restarted for system maintenance purposes. # The maintenance window for this instance. This specifies when the instance can be restarted for maintenance purposes.
-      &quot;day&quot;: 42, # day of week (1-7), starting on Monday.
-      &quot;hour&quot;: 42, # hour of day - 0 to 23.
-      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#maintenanceWindow**.
-      &quot;updateTrack&quot;: &quot;A String&quot;, # Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/admin-api/rest/v1/instance-settings#maintenance-timing-2ndgen).
-    },
-    &quot;pricingPlan&quot;: &quot;A String&quot;, # The pricing plan for this instance. This can be either **PER_USE** or **PACKAGE**. Only **PER_USE** is supported for Second Generation instances.
-    &quot;replicationType&quot;: &quot;A String&quot;, # The type of replication this instance uses. This can be either **ASYNCHRONOUS** or **SYNCHRONOUS**. (Deprecated) This property was only applicable to First Generation instances.
-    &quot;settingsVersion&quot;: &quot;A String&quot;, # The version of instance settings. This is a required field for update method to make sure concurrent updates are handled properly. During update, use the most recent settingsVersion value for this instance and do not try to update this value.
-    &quot;storageAutoResize&quot;: True or False, # Configuration to increase storage size automatically. The default value is true.
-    &quot;storageAutoResizeLimit&quot;: &quot;A String&quot;, # The maximum size to which storage capacity can be automatically increased. The default value is 0, which specifies that there is no limit.
-    &quot;tier&quot;: &quot;A String&quot;, # The tier (or machine type) for this instance, for example **db-custom-1-3840**.
-    &quot;userLabels&quot;: { # User-provided labels, represented as a dictionary where each label is a single key value pair.
-      &quot;a_key&quot;: &quot;A String&quot;,
-    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
   },
-  &quot;state&quot;: &quot;A String&quot;, # The current serving state of the Cloud SQL instance. This can be one of the following. *SQL_INSTANCE_STATE_UNSPECIFIED*: The state of the instance is unknown. *RUNNABLE*: The instance is running, or has been stopped by owner. *SUSPENDED*: The instance is not available, for example due to problems with billing. *PENDING_DELETE*: The instance is being deleted. *PENDING_CREATE*: The instance is being created. *MAINTENANCE*: The instance is down for maintenance. *FAILED*: The instance creation failed.
-  &quot;suspensionReason&quot;: [ # If the instance state is SUSPENDED, the reason for the suspension.
-    &quot;A String&quot;,
-  ],
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
 }</pre>
 </div>
 
 <div class="method">
-    <code class="details" id="getConnectSettings">getConnectSettings(project, instance, readTime=None, x__xgafv=None)</code>
-  <pre>Retrieves connect settings about a Cloud SQL instance.
+    <code class="details" id="verifyExternalSyncSettings">verifyExternalSyncSettings(project, instance, syncMode=None, verifyConnectionOnly=None, x__xgafv=None)</code>
+  <pre>Verify External primary instance external sync settings.
 
 Args:
   project: string, Project ID of the project that contains the instance. (required)
   instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
-  readTime: string, Optional. Optional snapshot read timestamp to trade freshness for performance.
+  syncMode: string, External sync mode
+    Allowed values
+      EXTERNAL_SYNC_MODE_UNSPECIFIED - Unknown external sync mode, will be defaulted to ONLINE mode
+      ONLINE - Online external sync will set up replication after initial data external sync
+      OFFLINE - Offline external sync only dumps and loads a one-time snapshot of the primary instance&#x27;s data
+  verifyConnectionOnly: boolean, Flag to enable verifying connection only
   x__xgafv: string, V1 error format.
     Allowed values
       1 - v1 error format
@@ -360,27 +301,22 @@
 Returns:
   An object of the form:
 
-    { # Connect settings retrieval response.
-  &quot;backendType&quot;: &quot;A String&quot;, # **SECOND_GEN**: Cloud SQL database instance. **EXTERNAL**: A database server that is not managed by Google. This property is read-only; use the **tier** property in the **settings** object to determine the database type.
-  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The **databaseVersion** field cannot be changed after instance creation. MySQL instances: **MYSQL_8_0**, **MYSQL_5_7** (default), or **MYSQL_5_6**. PostgreSQL instances: **POSTGRES_9_6**, **POSTGRES_10**, **POSTGRES_11** or **POSTGRES_12** (default). SQL Server instances: **SQLSERVER_2017_STANDARD** (default), **SQLSERVER_2017_ENTERPRISE**, **SQLSERVER_2017_EXPRESS**, or **SQLSERVER_2017_WEB**.
-  &quot;ipAddresses&quot;: [ # The assigned IP addresses for the instance.
-    { # Database instance IP Mapping.
-      &quot;ipAddress&quot;: &quot;A String&quot;, # The IP address assigned.
-      &quot;timeToRetire&quot;: &quot;A String&quot;, # The due time for this IP to be retired in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**. This field is only available when the IP is scheduled to be retired.
-      &quot;type&quot;: &quot;A String&quot;, # The type of this IP address. A **PRIMARY** address is a public address that can accept incoming connections. A **PRIVATE** address is a private address that can accept incoming connections. An **OUTGOING** address is the source address of connections originating from the instance, if supported.
+    { # Instance verify external sync settings response.
+  &quot;errors&quot;: [ # List of migration violations.
+    { # External primary instance migration setting error.
+      &quot;detail&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      &quot;kind&quot;: &quot;A String&quot;, # Can be *sql#externalSyncSettingError* or *sql#externalSyncSettingWarning*.
+      &quot;type&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
     },
   ],
-  &quot;kind&quot;: &quot;A String&quot;, # This is always `sql#connectSettings`.
-  &quot;serverCaCert&quot;: { # SslCerts Resource # SSL configuration.
-    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
-    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
-    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
-    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
-    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
-    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
-    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
-    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
-  },
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#migrationSettingErrorList*.
+  &quot;warnings&quot;: [ # List of migration warnings.
+    { # External primary instance migration setting error.
+      &quot;detail&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      &quot;kind&quot;: &quot;A String&quot;, # Can be *sql#externalSyncSettingError* or *sql#externalSyncSettingWarning*.
+      &quot;type&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+    },
+  ],
 }</pre>
 </div>
 
diff --git a/docs/dyn/sqladmin_v1.sslCerts.html b/docs/dyn/sqladmin_v1.sslCerts.html
new file mode 100644
index 0000000..8a5d946
--- /dev/null
+++ b/docs/dyn/sqladmin_v1.sslCerts.html
@@ -0,0 +1,407 @@
+<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="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.sslCerts.html">sslCerts</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="#createEphemeral">createEphemeral(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.</p>
+<p class="toc_element">
+  <code><a href="#delete">delete(project, instance, sha1Fingerprint, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes the SSL certificate. For First Generation instances, the certificate remains valid until the instance is restarted.</p>
+<p class="toc_element">
+  <code><a href="#get">get(project, instance, sha1Fingerprint, x__xgafv=None)</a></code></p>
+<p class="firstline">Retrieves a particular SSL certificate. Does not include the private key (required for usage). The private key must be saved from the response to initial creation.</p>
+<p class="toc_element">
+  <code><a href="#insert">insert(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates an SSL certificate and returns it along with the private key and server certificate authority. The new certificate will not be usable until the instance is restarted.</p>
+<p class="toc_element">
+  <code><a href="#list">list(project, instance, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists all of the current SSL certificates for the instance.</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="createEphemeral">createEphemeral(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.
+
+Args:
+  project: string, Project ID of the Cloud SQL project. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # SslCerts create ephemeral certificate request.
+  &quot;access_token&quot;: &quot;A String&quot;, # Access token to include in the signed certificate.
+  &quot;public_key&quot;: &quot;A String&quot;, # PEM encoded public key to include in the signed certificate.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # SslCerts Resource
+  &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+  &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+  &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+  &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+  &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="delete">delete(project, instance, sha1Fingerprint, x__xgafv=None)</code>
+  <pre>Deletes the SSL certificate. For First Generation instances, the certificate remains valid until the instance is restarted.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  sha1Fingerprint: string, Sha1 FingerPrint. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(project, instance, sha1Fingerprint, x__xgafv=None)</code>
+  <pre>Retrieves a particular SSL certificate. Does not include the private key (required for usage). The private key must be saved from the response to initial creation.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  sha1Fingerprint: string, Sha1 FingerPrint. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # SslCerts Resource
+  &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+  &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+  &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+  &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+  &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="insert">insert(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Creates an SSL certificate and returns it along with the private key and server certificate authority. The new certificate will not be usable until the instance is restarted.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # SslCerts insert request.
+  &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Must be a distinct name from the other certificates for this instance.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # SslCert insert response.
+  &quot;clientCert&quot;: { # SslCertDetail. # The new client certificate and private key.
+    &quot;certInfo&quot;: { # SslCerts Resource # The public information about the cert.
+      &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+      &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+      &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+      &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+      &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+      &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+      &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+      &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+    },
+    &quot;certPrivateKey&quot;: &quot;A String&quot;, # The private key for the client cert, in pem format. Keep private in order to protect your security.
+  },
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#sslCertsInsert*.
+  &quot;operation&quot;: { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource. # The operation to track the ssl certs insert request.
+    &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+      &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+    },
+    &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+      &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+        { # Database instance operation error.
+          &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+          &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+          &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+        },
+      ],
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+    },
+    &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+      &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+        &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+      },
+      &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+        &quot;A String&quot;,
+      ],
+      &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+      &quot;offload&quot;: True or False, # Option for export offload.
+      &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+        &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+          &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+        },
+        &quot;schemaOnly&quot;: True or False, # Export only schemas.
+        &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+    },
+    &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+      &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+        &quot;encryptionOptions&quot;: {
+          &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+          &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+          &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        },
+      },
+      &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+        &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+          &quot;A String&quot;,
+        ],
+        &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+      },
+      &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+      &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+      &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+      &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+    },
+    &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+    &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+    &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+    &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+    &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+    &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+    &quot;targetLink&quot;: &quot;A String&quot;,
+    &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+    &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+  },
+  &quot;serverCaCert&quot;: { # SslCerts Resource # The server Certificate Authority&#x27;s certificate. If this is missing you can force a new one to be generated by calling resetSslConfig method on instances resource.
+    &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+    &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+    &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+    &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+    &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+    &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+    &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+    &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(project, instance, x__xgafv=None)</code>
+  <pre>Lists all of the current SSL certificates for the instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # SslCerts list response.
+  &quot;items&quot;: [ # List of client certificates for the instance.
+    { # SslCerts Resource
+      &quot;cert&quot;: &quot;A String&quot;, # PEM representation.
+      &quot;certSerialNumber&quot;: &quot;A String&quot;, # Serial number, as extracted from the certificate.
+      &quot;commonName&quot;: &quot;A String&quot;, # User supplied name. Constrained to [a-zA-Z.-_ ]+.
+      &quot;createTime&quot;: &quot;A String&quot;, # The time when the certificate was created in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**
+      &quot;expirationTime&quot;: &quot;A String&quot;, # The time when the certificate expires in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+      &quot;instance&quot;: &quot;A String&quot;, # Name of the database instance.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always sql#sslCert.
+      &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+      &quot;sha1Fingerprint&quot;: &quot;A String&quot;, # Sha1 Fingerprint.
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#sslCertsList*.
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1.tiers.html b/docs/dyn/sqladmin_v1.tiers.html
new file mode 100644
index 0000000..fa22853
--- /dev/null
+++ b/docs/dyn/sqladmin_v1.tiers.html
@@ -0,0 +1,119 @@
+<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="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.tiers.html">tiers</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="#list">list(project, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists all available machine types (tiers) for Cloud SQL, for example, db-custom-1-3840. For more information, see https://cloud.google.com/sql/pricing.</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="list">list(project, x__xgafv=None)</code>
+  <pre>Lists all available machine types (tiers) for Cloud SQL, for example, db-custom-1-3840. For more information, see https://cloud.google.com/sql/pricing.
+
+Args:
+  project: string, Project ID of the project for which to list tiers. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Tiers list response.
+  &quot;items&quot;: [ # List of tiers.
+    { # A Google Cloud SQL service tier resource.
+      &quot;DiskQuota&quot;: &quot;A String&quot;, # The maximum disk size of this tier in bytes.
+      &quot;RAM&quot;: &quot;A String&quot;, # The maximum RAM usage of this tier in bytes.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#tier*.
+      &quot;region&quot;: [ # The applicable regions for this tier.
+        &quot;A String&quot;,
+      ],
+      &quot;tier&quot;: &quot;A String&quot;, # An identifier for the machine type, for example, db-custom-1-3840. For related information, see Pricing.
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#tiersList*.
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1.users.html b/docs/dyn/sqladmin_v1.users.html
new file mode 100644
index 0000000..4222aa1
--- /dev/null
+++ b/docs/dyn/sqladmin_v1.users.html
@@ -0,0 +1,453 @@
+<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="sqladmin_v1.html">Cloud SQL Admin API</a> . <a href="sqladmin_v1.users.html">users</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="#delete">delete(project, instance, host=None, name=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes a user from a Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#insert">insert(project, instance, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a new user in a Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#list">list(project, instance, body_etag=None, body_host=None, body_instance=None, body_kind=None, body_name=None, body_password=None, body_project=None, body_sqlserverUserDetails_disabled=None, body_sqlserverUserDetails_serverRoles=None, body_type=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Lists users in the specified Cloud SQL instance.</p>
+<p class="toc_element">
+  <code><a href="#update">update(project, instance, body=None, host=None, name=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates an existing user in a Cloud SQL instance.</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="delete">delete(project, instance, host=None, name=None, x__xgafv=None)</code>
+  <pre>Deletes a user from a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  host: string, Host of the user in the instance.
+  name: string, Name of the user in the instance.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="insert">insert(project, instance, body=None, x__xgafv=None)</code>
+  <pre>Creates a new user in a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A Cloud SQL user resource.
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API.
+  &quot;host&quot;: &quot;A String&quot;, # The host name from which the user can connect. For *insert* operations, host defaults to an empty string. For *update* operations, host is specified as part of the request URL. The host name cannot be updated after insertion.
+  &quot;instance&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance. This does not include the project ID. Can be omitted for *update* since it is already specified on the URL.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#user*.
+  &quot;name&quot;: &quot;A String&quot;, # The name of the user in the Cloud SQL instance. Can be omitted for *update* since it is already specified in the URL.
+  &quot;password&quot;: &quot;A String&quot;, # The password for the user.
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable. Can be omitted for *update* since it is already specified on the URL.
+  &quot;sqlserverUserDetails&quot;: { # Represents a Sql Server user on the Cloud SQL instance.
+    &quot;disabled&quot;: True or False, # If the user has been disabled
+    &quot;serverRoles&quot;: [ # The server roles for this user
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;type&quot;: &quot;A String&quot;, # The user type. It determines the method to authenticate the user during login. The default is the database&#x27;s built-in user type.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(project, instance, body_etag=None, body_host=None, body_instance=None, body_kind=None, body_name=None, body_password=None, body_project=None, body_sqlserverUserDetails_disabled=None, body_sqlserverUserDetails_serverRoles=None, body_type=None, x__xgafv=None)</code>
+  <pre>Lists users in the specified Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  body_etag: string, This field is deprecated and will be removed from a future version of the API.
+  body_host: string, The host name from which the user can connect. For *insert* operations, host defaults to an empty string. For *update* operations, host is specified as part of the request URL. The host name cannot be updated after insertion.
+  body_instance: string, The name of the Cloud SQL instance. This does not include the project ID. Can be omitted for *update* since it is already specified on the URL.
+  body_kind: string, This is always *sql#user*.
+  body_name: string, The name of the user in the Cloud SQL instance. Can be omitted for *update* since it is already specified in the URL.
+  body_password: string, The password for the user.
+  body_project: string, The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable. Can be omitted for *update* since it is already specified on the URL.
+  body_sqlserverUserDetails_disabled: boolean, If the user has been disabled
+  body_sqlserverUserDetails_serverRoles: string, The server roles for this user (repeated)
+  body_type: string, The user type. It determines the method to authenticate the user during login. The default is the database&#x27;s built-in user type.
+    Allowed values
+      BUILT_IN - The database&#x27;s built-in user type.
+      CLOUD_IAM_USER - Cloud IAM user.
+      CLOUD_IAM_SERVICE_ACCOUNT - Cloud IAM service account.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # User list response.
+  &quot;items&quot;: [ # List of user resources in the instance.
+    { # A Cloud SQL user resource.
+      &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API.
+      &quot;host&quot;: &quot;A String&quot;, # The host name from which the user can connect. For *insert* operations, host defaults to an empty string. For *update* operations, host is specified as part of the request URL. The host name cannot be updated after insertion.
+      &quot;instance&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance. This does not include the project ID. Can be omitted for *update* since it is already specified on the URL.
+      &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#user*.
+      &quot;name&quot;: &quot;A String&quot;, # The name of the user in the Cloud SQL instance. Can be omitted for *update* since it is already specified in the URL.
+      &quot;password&quot;: &quot;A String&quot;, # The password for the user.
+      &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable. Can be omitted for *update* since it is already specified on the URL.
+      &quot;sqlserverUserDetails&quot;: { # Represents a Sql Server user on the Cloud SQL instance.
+        &quot;disabled&quot;: True or False, # If the user has been disabled
+        &quot;serverRoles&quot;: [ # The server roles for this user
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;type&quot;: &quot;A String&quot;, # The user type. It determines the method to authenticate the user during login. The default is the database&#x27;s built-in user type.
+    },
+  ],
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#usersList*.
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="update">update(project, instance, body=None, host=None, name=None, x__xgafv=None)</code>
+  <pre>Updates an existing user in a Cloud SQL instance.
+
+Args:
+  project: string, Project ID of the project that contains the instance. (required)
+  instance: string, Database instance ID. This does not include the project ID. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A Cloud SQL user resource.
+  &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API.
+  &quot;host&quot;: &quot;A String&quot;, # The host name from which the user can connect. For *insert* operations, host defaults to an empty string. For *update* operations, host is specified as part of the request URL. The host name cannot be updated after insertion.
+  &quot;instance&quot;: &quot;A String&quot;, # The name of the Cloud SQL instance. This does not include the project ID. Can be omitted for *update* since it is already specified on the URL.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#user*.
+  &quot;name&quot;: &quot;A String&quot;, # The name of the user in the Cloud SQL instance. Can be omitted for *update* since it is already specified in the URL.
+  &quot;password&quot;: &quot;A String&quot;, # The password for the user.
+  &quot;project&quot;: &quot;A String&quot;, # The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable. Can be omitted for *update* since it is already specified on the URL.
+  &quot;sqlserverUserDetails&quot;: { # Represents a Sql Server user on the Cloud SQL instance.
+    &quot;disabled&quot;: True or False, # If the user has been disabled
+    &quot;serverRoles&quot;: [ # The server roles for this user
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;type&quot;: &quot;A String&quot;, # The user type. It determines the method to authenticate the user during login. The default is the database&#x27;s built-in user type.
+}
+
+  host: string, Optional. Host of the user in the instance.
+  name: string, Name of the user in the instance.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.
+  &quot;backupContext&quot;: { # Backup context. # The context for backup operation, if applicable.
+    &quot;backupId&quot;: &quot;A String&quot;, # The identifier of the backup.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#backupContext**.
+  },
+  &quot;endTime&quot;: &quot;A String&quot;, # The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;error&quot;: { # Database instance operation errors list wrapper. # If errors occurred during processing of this operation, this field will be populated.
+    &quot;errors&quot;: [ # The list of errors encountered while processing this operation.
+      { # Database instance operation error.
+        &quot;code&quot;: &quot;A String&quot;, # Identifies the specific error that occurred.
+        &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationError**.
+        &quot;message&quot;: &quot;A String&quot;, # Additional information about the error encountered.
+      },
+    ],
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operationErrors**.
+  },
+  &quot;exportContext&quot;: { # Database instance export context. # The context for export operation, if applicable.
+    &quot;csvExportOptions&quot;: { # Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.
+      &quot;selectQuery&quot;: &quot;A String&quot;, # The select query used to extract the data.
+    },
+    &quot;databases&quot;: [ # Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.
+      &quot;A String&quot;,
+    ],
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#exportContext**.
+    &quot;offload&quot;: True or False, # Option for export offload.
+    &quot;sqlExportOptions&quot;: { # Options for exporting data as SQL statements.
+      &quot;mysqlExportOptions&quot;: { # Options for exporting from MySQL.
+        &quot;masterData&quot;: 42, # Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.
+      },
+      &quot;schemaOnly&quot;: True or False, # Export only schemas.
+      &quot;tables&quot;: [ # Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.
+        &quot;A String&quot;,
+      ],
+    },
+    &quot;uri&quot;: &quot;A String&quot;, # The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.
+  },
+  &quot;importContext&quot;: { # Database instance import context. # The context for import operation, if applicable.
+    &quot;bakImportOptions&quot;: { # Import parameters specific to SQL Server .BAK files
+      &quot;encryptionOptions&quot;: {
+        &quot;certPath&quot;: &quot;A String&quot;, # Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+        &quot;pvkPassword&quot;: &quot;A String&quot;, # Password that encrypts the private key
+        &quot;pvkPath&quot;: &quot;A String&quot;, # Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.
+      },
+    },
+    &quot;csvImportOptions&quot;: { # Options for importing data as CSV.
+      &quot;columns&quot;: [ # The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.
+        &quot;A String&quot;,
+      ],
+      &quot;table&quot;: &quot;A String&quot;, # The table to which CSV data is imported.
+    },
+    &quot;database&quot;: &quot;A String&quot;, # The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.
+    &quot;fileType&quot;: &quot;A String&quot;, # The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.
+    &quot;importUser&quot;: &quot;A String&quot;, # The PostgreSQL user for this import operation. PostgreSQL instances only.
+    &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#importContext**.
+    &quot;uri&quot;: &quot;A String&quot;, # Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.
+  },
+  &quot;insertTime&quot;: &quot;A String&quot;, # The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;kind&quot;: &quot;A String&quot;, # This is always **sql#operation**.
+  &quot;name&quot;: &quot;A String&quot;, # An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.
+  &quot;operationType&quot;: &quot;A String&quot;, # The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**
+  &quot;selfLink&quot;: &quot;A String&quot;, # The URI of this resource.
+  &quot;startTime&quot;: &quot;A String&quot;, # The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.
+  &quot;status&quot;: &quot;A String&quot;, # The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**
+  &quot;targetId&quot;: &quot;A String&quot;, # Name of the database instance related to this operation.
+  &quot;targetLink&quot;: &quot;A String&quot;,
+  &quot;targetProject&quot;: &quot;A String&quot;, # The project ID of the target instance related to this operation.
+  &quot;user&quot;: &quot;A String&quot;, # The email address of the user who initiated this operation.
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/sqladmin_v1beta4.backupRuns.html b/docs/dyn/sqladmin_v1beta4.backupRuns.html
index 8868eab..5a38d32 100644
--- a/docs/dyn/sqladmin_v1beta4.backupRuns.html
+++ b/docs/dyn/sqladmin_v1beta4.backupRuns.html
@@ -85,7 +85,7 @@
 <p class="firstline">Retrieves a resource containing information about a backup run.</p>
 <p class="toc_element">
   <code><a href="#insert">insert(project, instance, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Creates a new backup run on demand. This method is applicable only to Second Generation instances.</p>
+<p class="firstline">Creates a new backup run on demand.</p>
 <p class="toc_element">
   <code><a href="#list">list(project, instance, maxResults=None, pageToken=None, x__xgafv=None)</a></code></p>
 <p class="firstline">Lists all backup runs associated with the project or a given instance and configuration in the reverse chronological order of the backup initiation time.</p>
@@ -105,7 +105,7 @@
 Args:
   project: string, Project ID of the project that contains the instance. (required)
   instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
-  id: string, The ID of the Backup Run to delete. To find a Backup Run ID, use the list method. (required)
+  id: string, The ID of the backup run to delete. To find a backup run ID, use the list method. (required)
   x__xgafv: string, V1 error format.
     Allowed values
       1 - v1 error format
@@ -192,7 +192,7 @@
 Args:
   project: string, Project ID of the project that contains the instance. (required)
   instance: string, Cloud SQL instance ID. This does not include the project ID. (required)
-  id: string, The ID of this Backup Run. (required)
+  id: string, The ID of this backup run. (required)
   x__xgafv: string, V1 error format.
     Allowed values
       1 - v1 error format
@@ -204,11 +204,11 @@
     { # A BackupRun resource.
   &quot;backupKind&quot;: &quot;A String&quot;, # Specifies the kind of backup, PHYSICAL or DEFAULT_SNAPSHOT.
   &quot;description&quot;: &quot;A String&quot;, # The description of this run, only applicable to on-demand backups.
-  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup. Applies only to Second Generation instances.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionConfiguration*.
     &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
   },
-  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup. Applies only to Second Generation instances.
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionStatus*.
     &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
   },
@@ -233,7 +233,7 @@
 
 <div class="method">
     <code class="details" id="insert">insert(project, instance, body=None, x__xgafv=None)</code>
-  <pre>Creates a new backup run on demand. This method is applicable only to Second Generation instances.
+  <pre>Creates a new backup run on demand.
 
 Args:
   project: string, Project ID of the project that contains the instance. (required)
@@ -244,11 +244,11 @@
 { # A BackupRun resource.
   &quot;backupKind&quot;: &quot;A String&quot;, # Specifies the kind of backup, PHYSICAL or DEFAULT_SNAPSHOT.
   &quot;description&quot;: &quot;A String&quot;, # The description of this run, only applicable to on-demand backups.
-  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup. Applies only to Second Generation instances.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionConfiguration*.
     &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
   },
-  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup. Applies only to Second Generation instances.
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionStatus*.
     &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
   },
@@ -371,11 +371,11 @@
     { # A BackupRun resource.
       &quot;backupKind&quot;: &quot;A String&quot;, # Specifies the kind of backup, PHYSICAL or DEFAULT_SNAPSHOT.
       &quot;description&quot;: &quot;A String&quot;, # The description of this run, only applicable to on-demand backups.
-      &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup. Applies only to Second Generation instances.
+      &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Encryption configuration specific to a backup.
         &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionConfiguration*.
         &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
       },
-      &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup. Applies only to Second Generation instances.
+      &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Encryption status specific to a backup.
         &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionStatus*.
         &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
       },
diff --git a/docs/dyn/sqladmin_v1beta4.flags.html b/docs/dyn/sqladmin_v1beta4.flags.html
index 1cee3b7..61b3099 100644
--- a/docs/dyn/sqladmin_v1beta4.flags.html
+++ b/docs/dyn/sqladmin_v1beta4.flags.html
@@ -79,7 +79,7 @@
 <p class="firstline">Close httplib2 connections.</p>
 <p class="toc_element">
   <code><a href="#list">list(databaseVersion=None, x__xgafv=None)</a></code></p>
-<p class="firstline">List all available database flags for Cloud SQL instances.</p>
+<p class="firstline">Lists all available database flags for Cloud SQL instances.</p>
 <h3>Method Details</h3>
 <div class="method">
     <code class="details" id="close">close()</code>
@@ -88,7 +88,7 @@
 
 <div class="method">
     <code class="details" id="list">list(databaseVersion=None, x__xgafv=None)</code>
-  <pre>List all available database flags for Cloud SQL instances.
+  <pre>Lists all available database flags for Cloud SQL instances.
 
 Args:
   databaseVersion: string, Database type and version you want to retrieve flags for. By default, this method returns flags for all database types and versions.
@@ -117,7 +117,7 @@
       &quot;maxValue&quot;: &quot;A String&quot;, # For *INTEGER* flags, the maximum allowed value.
       &quot;minValue&quot;: &quot;A String&quot;, # For *INTEGER* flags, the minimum allowed value.
       &quot;name&quot;: &quot;A String&quot;, # This is the name of the flag. Flag names always use underscores, not hyphens, for example: *max_allowed_packet*
-      &quot;requiresRestart&quot;: True or False, # Indicates whether changing this flag will trigger a database restart. Only applicable to Second Generation instances.
+      &quot;requiresRestart&quot;: True or False, # Indicates whether changing this flag will trigger a database restart.
       &quot;type&quot;: &quot;A String&quot;, # The type of the flag. Flags are typed to being *BOOLEAN*, *STRING*, *INTEGER* or *NONE*. *NONE* is used for flags which do not take a value, such as *skip_grant_tables*.
     },
   ],
diff --git a/docs/dyn/sqladmin_v1beta4.instances.html b/docs/dyn/sqladmin_v1beta4.instances.html
index 051036d..24802a6 100644
--- a/docs/dyn/sqladmin_v1beta4.instances.html
+++ b/docs/dyn/sqladmin_v1beta4.instances.html
@@ -94,7 +94,7 @@
 <p class="firstline">Exports data from a Cloud SQL instance to a Cloud Storage bucket as a SQL dump or CSV file.</p>
 <p class="toc_element">
   <code><a href="#failover">failover(project, instance, body=None, x__xgafv=None)</a></code></p>
-<p class="firstline">Failover the instance to its failover replica instance. Using this operation might cause your instance to restart.</p>
+<p class="firstline">Initiates a manual failover of a high availability (HA) primary instance to a standby instance, which becomes the primary instance. Users are then rerouted to the new primary. For more information, see the Overview of high availability page in the Cloud SQL documentation. If using Legacy HA (MySQL only), this causes the instance to failover to its failover replica instance.</p>
 <p class="toc_element">
   <code><a href="#get">get(project, instance, x__xgafv=None)</a></code></p>
 <p class="firstline">Retrieves a resource containing information about a Cloud SQL instance.</p>
@@ -449,7 +449,7 @@
         &quot;username&quot;: &quot;A String&quot;, # The username for the replication connection.
       },
     },
-    &quot;verifyGtidConsistency&quot;: True or False, # Verify GTID consistency for demote operation. Default value: *True*. Second Generation instances only. Setting this flag to false enables you to bypass GTID consistency check between on-premises primary instance and Cloud SQL instance during the demotion operation but also exposes you to the risk of future replication failures. Change the value only if you know the reason for the GTID divergence and are confident that doing so will not cause any replication issues.
+    &quot;verifyGtidConsistency&quot;: True or False, # Verify GTID consistency for demote operation. Default value: *True*. Setting this flag to false enables you to bypass GTID consistency check between on-premises primary instance and Cloud SQL instance during the demotion operation but also exposes you to the risk of future replication failures. Change the value only if you know the reason for the GTID divergence and are confident that doing so will not cause any replication issues.
   },
 }
 
@@ -647,7 +647,7 @@
 
 <div class="method">
     <code class="details" id="failover">failover(project, instance, body=None, x__xgafv=None)</code>
-  <pre>Failover the instance to its failover replica instance. Using this operation might cause your instance to restart.
+  <pre>Initiates a manual failover of a high availability (HA) primary instance to a standby instance, which becomes the primary instance. Users are then rerouted to the new primary. For more information, see the Overview of high availability page in the Cloud SQL documentation. If using Legacy HA (MySQL only), this causes the instance to failover to its failover replica instance.
 
 Args:
   project: string, ID of the project that contains the read replica. (required)
@@ -760,19 +760,19 @@
   &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
   &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
   &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
-  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
-  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance. Applies only to Second Generation instances.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionConfiguration*.
     &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
   },
-  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance. Applies only to Second Generation instances.
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionStatus*.
     &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
   },
   &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
-  &quot;failoverReplica&quot;: { # The name and status of the failover replica. This property is applicable only to Second Generation instances.
+  &quot;failoverReplica&quot;: { # The name and status of the failover replica.
     &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
-    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID. This property is applicable only to Second Generation instances.
+    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
   },
   &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
   &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
@@ -876,7 +876,7 @@
     &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: PD_SSD (default) or PD_HDD. Not used for First Generation instances.
     &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
       { # Database flags for Cloud SQL instances.
-        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
         &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to *on* for true and *off* for false. This field must be omitted if the flag doesn&#x27;t take a value.
       },
     ],
@@ -890,12 +890,12 @@
     ],
     &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
       &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
-      &quot;queryPlansPerMinute&quot;: 42, # Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.
+      &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
       &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
       &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
       &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
     },
-    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled.
       &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: *192.168.100.0/24*).
         { # An entry for an Access Control list.
           &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
@@ -1063,19 +1063,19 @@
   &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
   &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
   &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
-  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
-  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance. Applies only to Second Generation instances.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionConfiguration*.
     &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
   },
-  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance. Applies only to Second Generation instances.
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionStatus*.
     &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
   },
   &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
-  &quot;failoverReplica&quot;: { # The name and status of the failover replica. This property is applicable only to Second Generation instances.
+  &quot;failoverReplica&quot;: { # The name and status of the failover replica.
     &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
-    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID. This property is applicable only to Second Generation instances.
+    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
   },
   &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
   &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
@@ -1179,7 +1179,7 @@
     &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: PD_SSD (default) or PD_HDD. Not used for First Generation instances.
     &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
       { # Database flags for Cloud SQL instances.
-        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
         &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to *on* for true and *off* for false. This field must be omitted if the flag doesn&#x27;t take a value.
       },
     ],
@@ -1193,12 +1193,12 @@
     ],
     &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
       &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
-      &quot;queryPlansPerMinute&quot;: 42, # Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.
+      &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
       &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
       &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
       &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
     },
-    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled.
       &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: *192.168.100.0/24*).
         { # An entry for an Access Control list.
           &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
@@ -1342,19 +1342,19 @@
       &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
       &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
       &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
-      &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
-      &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance. Applies only to Second Generation instances.
+      &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+      &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
         &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionConfiguration*.
         &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
       },
-      &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance. Applies only to Second Generation instances.
+      &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
         &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionStatus*.
         &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
       },
       &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
-      &quot;failoverReplica&quot;: { # The name and status of the failover replica. This property is applicable only to Second Generation instances.
+      &quot;failoverReplica&quot;: { # The name and status of the failover replica.
         &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
-        &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID. This property is applicable only to Second Generation instances.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
       },
       &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
       &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
@@ -1458,7 +1458,7 @@
         &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: PD_SSD (default) or PD_HDD. Not used for First Generation instances.
         &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
           { # Database flags for Cloud SQL instances.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
+            &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
             &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to *on* for true and *off* for false. This field must be omitted if the flag doesn&#x27;t take a value.
           },
         ],
@@ -1472,12 +1472,12 @@
         ],
         &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
           &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
-          &quot;queryPlansPerMinute&quot;: 42, # Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.
+          &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
           &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
           &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
           &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
         },
-        &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+        &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled.
           &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: *192.168.100.0/24*).
             { # An entry for an Access Control list.
               &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
@@ -1593,19 +1593,19 @@
   &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
   &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
   &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
-  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
-  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance. Applies only to Second Generation instances.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionConfiguration*.
     &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
   },
-  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance. Applies only to Second Generation instances.
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionStatus*.
     &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
   },
   &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
-  &quot;failoverReplica&quot;: { # The name and status of the failover replica. This property is applicable only to Second Generation instances.
+  &quot;failoverReplica&quot;: { # The name and status of the failover replica.
     &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
-    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID. This property is applicable only to Second Generation instances.
+    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
   },
   &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
   &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
@@ -1709,7 +1709,7 @@
     &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: PD_SSD (default) or PD_HDD. Not used for First Generation instances.
     &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
       { # Database flags for Cloud SQL instances.
-        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
         &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to *on* for true and *off* for false. This field must be omitted if the flag doesn&#x27;t take a value.
       },
     ],
@@ -1723,12 +1723,12 @@
     ],
     &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
       &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
-      &quot;queryPlansPerMinute&quot;: 42, # Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.
+      &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
       &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
       &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
       &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
     },
-    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled.
       &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: *192.168.100.0/24*).
         { # An entry for an Access Control list.
           &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
@@ -2583,19 +2583,19 @@
   &quot;backendType&quot;: &quot;A String&quot;, #  *SECOND_GEN*: Cloud SQL database instance. *EXTERNAL*: A database server that is not managed by Google. This property is read-only; use the *tier* property in the *settings* object to determine the database type.
   &quot;connectionName&quot;: &quot;A String&quot;, # Connection name of the Cloud SQL instance used in connection strings.
   &quot;currentDiskSize&quot;: &quot;A String&quot;, # The current disk usage of the instance in bytes. This property has been deprecated. Use the &quot;cloudsql.googleapis.com/database/disk/bytes_used&quot; metric in Cloud Monitoring API instead. Please see this announcement for details.
-  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
-  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance. Applies only to Second Generation instances.
+  &quot;databaseVersion&quot;: &quot;A String&quot;, # The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.
+  &quot;diskEncryptionConfiguration&quot;: { # Disk encryption configuration for an instance. # Disk encryption configuration specific to an instance.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionConfiguration*.
     &quot;kmsKeyName&quot;: &quot;A String&quot;, # Resource name of KMS key for disk encryption
   },
-  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance. Applies only to Second Generation instances.
+  &quot;diskEncryptionStatus&quot;: { # Disk encryption status for an instance. # Disk encryption status specific to an instance.
     &quot;kind&quot;: &quot;A String&quot;, # This is always *sql#diskEncryptionStatus*.
     &quot;kmsKeyVersionName&quot;: &quot;A String&quot;, # KMS key version used to encrypt the Cloud SQL instance resource
   },
   &quot;etag&quot;: &quot;A String&quot;, # This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.
-  &quot;failoverReplica&quot;: { # The name and status of the failover replica. This property is applicable only to Second Generation instances.
+  &quot;failoverReplica&quot;: { # The name and status of the failover replica.
     &quot;available&quot;: True or False, # The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.
-    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID. This property is applicable only to Second Generation instances.
+    &quot;name&quot;: &quot;A String&quot;, # The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn&#x27;t include the project ID.
   },
   &quot;gceZone&quot;: &quot;A String&quot;, # The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.
   &quot;instanceType&quot;: &quot;A String&quot;, # The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer&#x27;s premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.
@@ -2699,7 +2699,7 @@
     &quot;dataDiskType&quot;: &quot;A String&quot;, # The type of data disk: PD_SSD (default) or PD_HDD. Not used for First Generation instances.
     &quot;databaseFlags&quot;: [ # The database flags passed to the instance at startup.
       { # Database flags for Cloud SQL instances.
-        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
+        &quot;name&quot;: &quot;A String&quot;, # The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.
         &quot;value&quot;: &quot;A String&quot;, # The value of the flag. Booleans are set to *on* for true and *off* for false. This field must be omitted if the flag doesn&#x27;t take a value.
       },
     ],
@@ -2713,12 +2713,12 @@
     ],
     &quot;insightsConfig&quot;: { # Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration. # Insights configuration, for now relevant only for Postgres.
       &quot;queryInsightsEnabled&quot;: True or False, # Whether Query Insights feature is enabled.
-      &quot;queryPlansPerMinute&quot;: 42, # Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.
+      &quot;queryPlansPerMinute&quot;: 42, # Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.
       &quot;queryStringLength&quot;: 42, # Maximum query length stored in bytes. Default value: 1024 bytes. Range: 256-4500 bytes. Query length more than this field value will be truncated to this value. When unset, query length will be the default value. Changing query length will restart the database.
       &quot;recordApplicationTags&quot;: True or False, # Whether Query Insights will record application tags from query when enabled.
       &quot;recordClientAddress&quot;: True or False, # Whether Query Insights will record client address when enabled.
     },
-    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances.
+    &quot;ipConfiguration&quot;: { # IP Management configuration. # The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled.
       &quot;authorizedNetworks&quot;: [ # The list of external networks that are allowed to connect to the instance using the IP. In &#x27;CIDR&#x27; notation, also known as &#x27;slash&#x27; notation (for example: *192.168.100.0/24*).
         { # An entry for an Access Control list.
           &quot;expirationTime&quot;: &quot;A String&quot;, # The time when this access control entry expires in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.
diff --git a/docs/dyn/tagmanager_v2.accounts.containers.workspaces.built_in_variables.html b/docs/dyn/tagmanager_v2.accounts.containers.workspaces.built_in_variables.html
index 3b55984..89c8964 100644
--- a/docs/dyn/tagmanager_v2.accounts.containers.workspaces.built_in_variables.html
+++ b/docs/dyn/tagmanager_v2.accounts.containers.workspaces.built_in_variables.html
@@ -216,6 +216,9 @@
       requestMethod - 
       clientName - 
       queryString - 
+      serverPageLocationUrl - 
+      serverPageLocationPath - 
+      serverPageLocationHostname - 
   x__xgafv: string, V1 error format.
     Allowed values
       1 - v1 error format
@@ -356,6 +359,9 @@
       requestMethod - 
       clientName - 
       queryString - 
+      serverPageLocationUrl - 
+      serverPageLocationPath - 
+      serverPageLocationHostname - 
   x__xgafv: string, V1 error format.
     Allowed values
       1 - v1 error format
@@ -525,6 +531,9 @@
       requestMethod - 
       clientName - 
       queryString - 
+      serverPageLocationUrl - 
+      serverPageLocationPath - 
+      serverPageLocationHostname - 
   x__xgafv: string, V1 error format.
     Allowed values
       1 - v1 error format
diff --git a/googleapiclient/discovery_cache/documents/acceleratedmobilepageurl.v1.json b/googleapiclient/discovery_cache/documents/acceleratedmobilepageurl.v1.json
index 9b09e97..1b46f4d 100644
--- a/googleapiclient/discovery_cache/documents/acceleratedmobilepageurl.v1.json
+++ b/googleapiclient/discovery_cache/documents/acceleratedmobilepageurl.v1.json
@@ -115,7 +115,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://acceleratedmobilepageurl.googleapis.com/",
   "schemas": {
     "AmpUrl": {
diff --git a/googleapiclient/discovery_cache/documents/accessapproval.v1.json b/googleapiclient/discovery_cache/documents/accessapproval.v1.json
index 65928de..cc749dc 100644
--- a/googleapiclient/discovery_cache/documents/accessapproval.v1.json
+++ b/googleapiclient/discovery_cache/documents/accessapproval.v1.json
@@ -754,7 +754,7 @@
       }
     }
   },
-  "revision": "20210716",
+  "revision": "20210723",
   "rootUrl": "https://accessapproval.googleapis.com/",
   "schemas": {
     "AccessApprovalSettings": {
diff --git a/googleapiclient/discovery_cache/documents/accesscontextmanager.v1.json b/googleapiclient/discovery_cache/documents/accesscontextmanager.v1.json
index 868d757..2f5e1a9 100644
--- a/googleapiclient/discovery_cache/documents/accesscontextmanager.v1.json
+++ b/googleapiclient/discovery_cache/documents/accesscontextmanager.v1.json
@@ -943,7 +943,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://accesscontextmanager.googleapis.com/",
   "schemas": {
     "AccessLevel": {
diff --git a/googleapiclient/discovery_cache/documents/accesscontextmanager.v1beta.json b/googleapiclient/discovery_cache/documents/accesscontextmanager.v1beta.json
index e61f387..4d4ccf2 100644
--- a/googleapiclient/discovery_cache/documents/accesscontextmanager.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/accesscontextmanager.v1beta.json
@@ -609,7 +609,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://accesscontextmanager.googleapis.com/",
   "schemas": {
     "AccessLevel": {
diff --git a/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.2.json b/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.2.json
index a215adb..347dc5e 100644
--- a/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.2.json
+++ b/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.2.json
@@ -15,7 +15,7 @@
   "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest",
-  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/A249TVo6dLDeSznlWT_vaeYMs4g\"",
+  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/X0Fc7JxXDQWMuYY6RaDO4JgT_o8\"",
   "icons": {
     "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
     "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -259,7 +259,7 @@
       }
     }
   },
-  "revision": "20210718",
+  "revision": "20210725",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "Account": {
diff --git a/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.3.json b/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.3.json
index 6845e14..3d3f225 100644
--- a/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.3.json
+++ b/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.3.json
@@ -15,7 +15,7 @@
   "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest",
-  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/jQTaS6wwiyLdmkV3tYdckgCPAj0\"",
+  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/_cIH3d5t3MiKPg5aWuy50XtXXb0\"",
   "icons": {
     "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
     "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -699,7 +699,7 @@
       }
     }
   },
-  "revision": "20210718",
+  "revision": "20210725",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "Account": {
diff --git a/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.4.json b/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.4.json
index 68d096a..8d1c4d6 100644
--- a/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.4.json
+++ b/googleapiclient/discovery_cache/documents/adexchangebuyer.v1.4.json
@@ -15,7 +15,7 @@
   "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest",
-  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/UGDXmK_qyasemPEfhFzt6WKQovg\"",
+  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/1dlKfDUB7WMEncYh7eNZDmXqECk\"",
   "icons": {
     "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
     "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -1255,7 +1255,7 @@
       }
     }
   },
-  "revision": "20210718",
+  "revision": "20210725",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "Account": {
diff --git a/googleapiclient/discovery_cache/documents/adexchangebuyer2.v2beta1.json b/googleapiclient/discovery_cache/documents/adexchangebuyer2.v2beta1.json
index 37ffb3f..8c0446e 100644
--- a/googleapiclient/discovery_cache/documents/adexchangebuyer2.v2beta1.json
+++ b/googleapiclient/discovery_cache/documents/adexchangebuyer2.v2beta1.json
@@ -2568,7 +2568,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210724",
   "rootUrl": "https://adexchangebuyer.googleapis.com/",
   "schemas": {
     "AbsoluteDateRange": {
diff --git a/googleapiclient/discovery_cache/documents/admin.datatransfer_v1.json b/googleapiclient/discovery_cache/documents/admin.datatransfer_v1.json
index 633b4af..7ba8979 100644
--- a/googleapiclient/discovery_cache/documents/admin.datatransfer_v1.json
+++ b/googleapiclient/discovery_cache/documents/admin.datatransfer_v1.json
@@ -17,7 +17,7 @@
   "canonicalName": "DataTransfer",
   "description": "Admin SDK lets administrators of enterprise domains to view and manage resources like user, groups etc. It also provides audit and usage reports of domain.",
   "discoveryVersion": "v1",
-  "documentationLink": "http://developers.google.com/admin-sdk/",
+  "documentationLink": "https://developers.google.com/admin-sdk/",
   "fullyEncodeReservedExpansion": true,
   "icons": {
     "x16": "http://www.google.com/images/icons/product/search-16.gif",
@@ -272,7 +272,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://admin.googleapis.com/",
   "schemas": {
     "Application": {
diff --git a/googleapiclient/discovery_cache/documents/admin.directory_v1.json b/googleapiclient/discovery_cache/documents/admin.directory_v1.json
index 6fde75e..40c3c22 100644
--- a/googleapiclient/discovery_cache/documents/admin.directory_v1.json
+++ b/googleapiclient/discovery_cache/documents/admin.directory_v1.json
@@ -98,7 +98,7 @@
   "canonicalName": "directory",
   "description": "Admin SDK lets administrators of enterprise domains to view and manage resources like user, groups etc. It also provides audit and usage reports of domain.",
   "discoveryVersion": "v1",
-  "documentationLink": "http://developers.google.com/admin-sdk/",
+  "documentationLink": "https://developers.google.com/admin-sdk/",
   "fullyEncodeReservedExpansion": true,
   "icons": {
     "x16": "http://www.google.com/images/icons/product/search-16.gif",
@@ -193,7 +193,7 @@
     "asps": {
       "methods": {
         "delete": {
-          "description": "Delete an ASP issued by a user.",
+          "description": "Deletes an ASP issued by a user.",
           "flatPath": "admin/directory/v1/users/{userKey}/asps/{codeId}",
           "httpMethod": "DELETE",
           "id": "directory.asps.delete",
@@ -222,7 +222,7 @@
           ]
         },
         "get": {
-          "description": "Get information about an ASP issued by a user.",
+          "description": "Gets information about an ASP issued by a user.",
           "flatPath": "admin/directory/v1/users/{userKey}/asps/{codeId}",
           "httpMethod": "GET",
           "id": "directory.asps.get",
@@ -254,7 +254,7 @@
           ]
         },
         "list": {
-          "description": "List the ASPs issued by a user.",
+          "description": "Lists the ASPs issued by a user.",
           "flatPath": "admin/directory/v1/users/{userKey}/asps",
           "httpMethod": "GET",
           "id": "directory.asps.list",
@@ -282,7 +282,7 @@
     "channels": {
       "methods": {
         "stop": {
-          "description": "Stop watching resources through this channel.",
+          "description": "Stops watching resources through this channel.",
           "flatPath": "admin/directory_v1/channels/stop",
           "httpMethod": "POST",
           "id": "admin.channels.stop",
@@ -478,7 +478,7 @@
           ]
         },
         "moveDevicesToOu": {
-          "description": "Move or insert multiple Chrome OS devices to an organizational unit. You can move up to 50 devices at once.",
+          "description": "Moves or inserts multiple Chrome OS devices to an organizational unit. You can move up to 50 devices at once.",
           "flatPath": "admin/directory/v1/customer/{customerId}/devices/chromeos/moveDevicesToOu",
           "httpMethod": "POST",
           "id": "directory.chromeosdevices.moveDevicesToOu",
@@ -724,7 +724,7 @@
           ]
         },
         "patch": {
-          "description": "Patch Customers via Apiary Patch Orchestration",
+          "description": "Patches a customer.",
           "flatPath": "admin/directory/v1/customers/{customerKey}",
           "httpMethod": "PATCH",
           "id": "directory.customers.patch",
@@ -1357,7 +1357,7 @@
           ]
         },
         "list": {
-          "description": "Retrieve all groups of a domain or of a user given a userKey (paginated)",
+          "description": "Retrieves all groups of a domain or of a user given a userKey (paginated).",
           "flatPath": "admin/directory/v1/groups",
           "httpMethod": "GET",
           "id": "directory.groups.list",
@@ -2409,7 +2409,7 @@
               ]
             },
             "patch": {
-              "description": "Patches a building via Apiary Patch Orchestration.",
+              "description": "Patches a building.",
               "flatPath": "admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}",
               "httpMethod": "PATCH",
               "id": "directory.resources.buildings.patch",
@@ -2648,7 +2648,7 @@
               ]
             },
             "patch": {
-              "description": "Patches a calendar resource via Apiary Patch Orchestration.",
+              "description": "Patches a calendar resource.",
               "flatPath": "admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}",
               "httpMethod": "PATCH",
               "id": "directory.resources.calendars.patch",
@@ -2845,7 +2845,7 @@
               ]
             },
             "patch": {
-              "description": "Patches a feature via Apiary Patch Orchestration.",
+              "description": "Patches a feature.",
               "flatPath": "admin/directory/v1/customer/{customer}/resources/features/{featureKey}",
               "httpMethod": "PATCH",
               "id": "directory.resources.features.patch",
@@ -2978,7 +2978,7 @@
           ]
         },
         "get": {
-          "description": "Retrieve a role assignment.",
+          "description": "Retrieves a role assignment.",
           "flatPath": "admin/directory/v1/customer/{customer}/roleassignments/{roleAssignmentId}",
           "httpMethod": "GET",
           "id": "directory.roleAssignments.get",
@@ -3214,7 +3214,7 @@
           ]
         },
         "patch": {
-          "description": "Patch role via Apiary Patch Orchestration",
+          "description": "Patches a role.",
           "flatPath": "admin/directory/v1/customer/{customer}/roles/{roleId}",
           "httpMethod": "PATCH",
           "id": "directory.roles.patch",
@@ -3286,7 +3286,7 @@
     "schemas": {
       "methods": {
         "delete": {
-          "description": "Delete schema",
+          "description": "Deletes a schema.",
           "flatPath": "admin/directory/v1/customer/{customerId}/schemas/{schemaKey}",
           "httpMethod": "DELETE",
           "id": "directory.schemas.delete",
@@ -3314,7 +3314,7 @@
           ]
         },
         "get": {
-          "description": "Retrieve schema",
+          "description": "Retrieves a schema.",
           "flatPath": "admin/directory/v1/customer/{customerId}/schemas/{schemaKey}",
           "httpMethod": "GET",
           "id": "directory.schemas.get",
@@ -3346,7 +3346,7 @@
           ]
         },
         "insert": {
-          "description": "Create schema.",
+          "description": "Creates a schema.",
           "flatPath": "admin/directory/v1/customer/{customerId}/schemas",
           "httpMethod": "POST",
           "id": "directory.schemas.insert",
@@ -3373,7 +3373,7 @@
           ]
         },
         "list": {
-          "description": "Retrieve all schemas for a customer",
+          "description": "Retrieves all schemas for a customer.",
           "flatPath": "admin/directory/v1/customer/{customerId}/schemas",
           "httpMethod": "GET",
           "id": "directory.schemas.list",
@@ -3398,7 +3398,7 @@
           ]
         },
         "patch": {
-          "description": "Patch Schema via Apiary Patch Orchestration",
+          "description": "Patches a schema.",
           "flatPath": "admin/directory/v1/customer/{customerId}/schemas/{schemaKey}",
           "httpMethod": "PATCH",
           "id": "directory.schemas.patch",
@@ -3432,7 +3432,7 @@
           ]
         },
         "update": {
-          "description": "Update schema",
+          "description": "Updates a schema.",
           "flatPath": "admin/directory/v1/customer/{customerId}/schemas/{schemaKey}",
           "httpMethod": "PUT",
           "id": "directory.schemas.update",
@@ -3470,7 +3470,7 @@
     "tokens": {
       "methods": {
         "delete": {
-          "description": "Delete all access tokens issued by a user for an application.",
+          "description": "Deletes all access tokens issued by a user for an application.",
           "flatPath": "admin/directory/v1/users/{userKey}/tokens/{clientId}",
           "httpMethod": "DELETE",
           "id": "directory.tokens.delete",
@@ -3498,7 +3498,7 @@
           ]
         },
         "get": {
-          "description": "Get information about an access token issued by a user.",
+          "description": "Gets information about an access token issued by a user.",
           "flatPath": "admin/directory/v1/users/{userKey}/tokens/{clientId}",
           "httpMethod": "GET",
           "id": "directory.tokens.get",
@@ -3557,7 +3557,7 @@
     "twoStepVerification": {
       "methods": {
         "turnOff": {
-          "description": "Turn off 2-Step Verification for user.",
+          "description": "Turns off 2-Step Verification for user.",
           "flatPath": "admin/directory/v1/users/{userKey}/twoStepVerification/turnOff",
           "httpMethod": "POST",
           "id": "directory.twoStepVerification.turnOff",
@@ -3866,7 +3866,7 @@
           ]
         },
         "signOut": {
-          "description": "Sign a user out of all web and device sessions and reset their sign-in cookies. User will have to sign in by authenticating again.",
+          "description": "Signs a user out of all web and device sessions and reset their sign-in cookies. User will have to sign in by authenticating again.",
           "flatPath": "admin/directory/v1/users/{userKey}/signOut",
           "httpMethod": "POST",
           "id": "directory.users.signOut",
@@ -3938,7 +3938,7 @@
           ]
         },
         "watch": {
-          "description": "Watch for changes in users list",
+          "description": "Watches for changes in users list.",
           "flatPath": "admin/directory/v1/users/watch",
           "httpMethod": "POST",
           "id": "directory.users.watch",
@@ -4176,7 +4176,7 @@
               ]
             },
             "watch": {
-              "description": "Watch for changes in users list.",
+              "description": "Watches for changes in users list.",
               "flatPath": "admin/directory/v1/users/{userKey}/aliases/watch",
               "httpMethod": "POST",
               "id": "directory.users.aliases.watch",
@@ -4329,7 +4329,7 @@
     "verificationCodes": {
       "methods": {
         "generate": {
-          "description": "Generate new backup verification codes for the user.",
+          "description": "Generates new backup verification codes for the user.",
           "flatPath": "admin/directory/v1/users/{userKey}/verificationCodes/generate",
           "httpMethod": "POST",
           "id": "directory.verificationCodes.generate",
@@ -4350,7 +4350,7 @@
           ]
         },
         "invalidate": {
-          "description": "Invalidate the current backup verification codes for the user.",
+          "description": "Invalidates the current backup verification codes for the user.",
           "flatPath": "admin/directory/v1/users/{userKey}/verificationCodes/invalidate",
           "httpMethod": "POST",
           "id": "directory.verificationCodes.invalidate",
@@ -4397,7 +4397,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://admin.googleapis.com/",
   "schemas": {
     "Alias": {
diff --git a/googleapiclient/discovery_cache/documents/admin.reports_v1.json b/googleapiclient/discovery_cache/documents/admin.reports_v1.json
index 967d0f3..3e72367 100644
--- a/googleapiclient/discovery_cache/documents/admin.reports_v1.json
+++ b/googleapiclient/discovery_cache/documents/admin.reports_v1.json
@@ -17,7 +17,7 @@
   "canonicalName": "reports",
   "description": "Admin SDK lets administrators of enterprise domains to view and manage resources like user, groups etc. It also provides audit and usage reports of domain.",
   "discoveryVersion": "v1",
-  "documentationLink": "http://developers.google.com/admin-sdk/",
+  "documentationLink": "https://developers.google.com/admin-sdk/",
   "fullyEncodeReservedExpansion": true,
   "icons": {
     "x16": "http://www.google.com/images/icons/product/search-16.gif",
@@ -631,7 +631,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://admin.googleapis.com/",
   "schemas": {
     "Activities": {
diff --git a/googleapiclient/discovery_cache/documents/admob.v1.json b/googleapiclient/discovery_cache/documents/admob.v1.json
index 4fb306e..e893990 100644
--- a/googleapiclient/discovery_cache/documents/admob.v1.json
+++ b/googleapiclient/discovery_cache/documents/admob.v1.json
@@ -321,7 +321,7 @@
       }
     }
   },
-  "revision": "20210718",
+  "revision": "20210724",
   "rootUrl": "https://admob.googleapis.com/",
   "schemas": {
     "AdUnit": {
diff --git a/googleapiclient/discovery_cache/documents/admob.v1beta.json b/googleapiclient/discovery_cache/documents/admob.v1beta.json
index b383795..8e12aed 100644
--- a/googleapiclient/discovery_cache/documents/admob.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/admob.v1beta.json
@@ -321,7 +321,7 @@
       }
     }
   },
-  "revision": "20210718",
+  "revision": "20210724",
   "rootUrl": "https://admob.googleapis.com/",
   "schemas": {
     "AdUnit": {
diff --git a/googleapiclient/discovery_cache/documents/adsense.v2.json b/googleapiclient/discovery_cache/documents/adsense.v2.json
index 66e6303..67e7d86 100644
--- a/googleapiclient/discovery_cache/documents/adsense.v2.json
+++ b/googleapiclient/discovery_cache/documents/adsense.v2.json
@@ -1567,7 +1567,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://adsense.googleapis.com/",
   "schemas": {
     "Account": {
diff --git a/googleapiclient/discovery_cache/documents/alertcenter.v1beta1.json b/googleapiclient/discovery_cache/documents/alertcenter.v1beta1.json
index 76c5d47..bf9262f 100644
--- a/googleapiclient/discovery_cache/documents/alertcenter.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/alertcenter.v1beta1.json
@@ -423,7 +423,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://alertcenter.googleapis.com/",
   "schemas": {
     "AccountWarning": {
@@ -688,6 +688,50 @@
       },
       "type": "object"
     },
+    "AppsOutage": {
+      "description": "An outage incident reported by Google for a Google Workspace (formerly G Suite) application.",
+      "id": "AppsOutage",
+      "properties": {
+        "dashboardUri": {
+          "description": "Link to the outage event in Google Workspace Status Dashboard",
+          "type": "string"
+        },
+        "nextUpdateTime": {
+          "description": "Timestamp by which the next update shall be provided.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "products": {
+          "description": "List of products impacted by the outage.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "resolutionTime": {
+          "description": "Timestamp of the outage expected or confirmed resolution. (Used only when known).",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "status": {
+          "description": "Current outage status.",
+          "enum": [
+            "STATUS_UNSPECIFIED",
+            "NEW",
+            "ONGOING",
+            "RESOLVED"
+          ],
+          "enumDescriptions": [
+            "Status is unspecified.",
+            "The incident has just been reported.",
+            "The incidnet is ongoing.",
+            "The incident has been resolved."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "Attachment": {
       "description": "Attachment with application-specific information about an alert.",
       "id": "Attachment",
@@ -1163,30 +1207,6 @@
       },
       "type": "object"
     },
-    "OutOfDomainForwarding": {
-      "description": "An alert that gets triggered when a user enables autoforwarding to an email which is outside of its domain",
-      "id": "OutOfDomainForwarding",
-      "properties": {
-        "actorEmail": {
-          "description": "Email of the actor who triggered the alert.",
-          "type": "string"
-        },
-        "enableTime": {
-          "description": "The time the email forwarding was enabled",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "forwardeeEmail": {
-          "description": "Email to which emails are being forwarded",
-          "type": "string"
-        },
-        "ipAddress": {
-          "description": "IP address of the user while enabling forwarding",
-          "type": "string"
-        }
-      },
-      "type": "object"
-    },
     "PhishingSpike": {
       "description": "Alert for a spike in user reported phishing. *Warning*: This type has been deprecated. Use [MailPhishing](/admin-sdk/alertcenter/reference/rest/v1beta1/MailPhishing) instead.",
       "id": "PhishingSpike",
diff --git a/googleapiclient/discovery_cache/documents/analyticsadmin.v1alpha.json b/googleapiclient/discovery_cache/documents/analyticsadmin.v1alpha.json
index 68c811f..8e53f74 100644
--- a/googleapiclient/discovery_cache/documents/analyticsadmin.v1alpha.json
+++ b/googleapiclient/discovery_cache/documents/analyticsadmin.v1alpha.json
@@ -3092,7 +3092,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://analyticsadmin.googleapis.com/",
   "schemas": {
     "GoogleAnalyticsAdminV1alphaAccount": {
@@ -3632,7 +3632,7 @@
           "type": "string"
         },
         "measurementUnit": {
-          "description": "Required. Immutable. The type for the custom metric's value.",
+          "description": "Required. The type for the custom metric's value.",
           "enum": [
             "MEASUREMENT_UNIT_UNSPECIFIED",
             "STANDARD",
diff --git a/googleapiclient/discovery_cache/documents/analyticsdata.v1beta.json b/googleapiclient/discovery_cache/documents/analyticsdata.v1beta.json
index 6497d11..87701dd 100644
--- a/googleapiclient/discovery_cache/documents/analyticsdata.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/analyticsdata.v1beta.json
@@ -284,7 +284,7 @@
       }
     }
   },
-  "revision": "20210715",
+  "revision": "20210723",
   "rootUrl": "https://analyticsdata.googleapis.com/",
   "schemas": {
     "BatchRunPivotReportsRequest": {
diff --git a/googleapiclient/discovery_cache/documents/androiddeviceprovisioning.v1.json b/googleapiclient/discovery_cache/documents/androiddeviceprovisioning.v1.json
index 4c6f56e..6a88213 100644
--- a/googleapiclient/discovery_cache/documents/androiddeviceprovisioning.v1.json
+++ b/googleapiclient/discovery_cache/documents/androiddeviceprovisioning.v1.json
@@ -825,7 +825,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://androiddeviceprovisioning.googleapis.com/",
   "schemas": {
     "ClaimDeviceRequest": {
diff --git a/googleapiclient/discovery_cache/documents/androidenterprise.v1.json b/googleapiclient/discovery_cache/documents/androidenterprise.v1.json
index 64e3807..aa773c0 100644
--- a/googleapiclient/discovery_cache/documents/androidenterprise.v1.json
+++ b/googleapiclient/discovery_cache/documents/androidenterprise.v1.json
@@ -2610,7 +2610,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210721",
   "rootUrl": "https://androidenterprise.googleapis.com/",
   "schemas": {
     "Administrator": {
diff --git a/googleapiclient/discovery_cache/documents/androidpublisher.v3.json b/googleapiclient/discovery_cache/documents/androidpublisher.v3.json
index 62f5149..6430c34 100644
--- a/googleapiclient/discovery_cache/documents/androidpublisher.v3.json
+++ b/googleapiclient/discovery_cache/documents/androidpublisher.v3.json
@@ -439,7 +439,7 @@
               ],
               "parameters": {
                 "ackBundleInstallationWarning": {
-                  "description": "Must be set to true if the bundle installation may trigger a warning on user devices (for example, if installation size may be over a threshold, typically 100 MB).",
+                  "description": "Must be set to true if the app bundle installation may trigger a warning on user devices (for example, if installation size may be over a threshold, typically 100 MB).",
                   "location": "query",
                   "type": "boolean"
                 },
@@ -2676,7 +2676,7 @@
       }
     }
   },
-  "revision": "20210701",
+  "revision": "20210724",
   "rootUrl": "https://androidpublisher.googleapis.com/",
   "schemas": {
     "Apk": {
@@ -2791,7 +2791,7 @@
       "type": "object"
     },
     "Bundle": {
-      "description": "Information about a bundle. The resource for BundlesService.",
+      "description": "Information about an app bundle. The resource for BundlesService.",
       "id": "Bundle",
       "properties": {
         "sha1": {
@@ -2811,11 +2811,11 @@
       "type": "object"
     },
     "BundlesListResponse": {
-      "description": "Response listing all bundles.",
+      "description": "Response listing all app bundles.",
       "id": "BundlesListResponse",
       "properties": {
         "bundles": {
-          "description": "All bundles.",
+          "description": "All app bundles.",
           "items": {
             "$ref": "Bundle"
           },
diff --git a/googleapiclient/discovery_cache/documents/apigateway.v1.json b/googleapiclient/discovery_cache/documents/apigateway.v1.json
index fa6ba41..a7e8386 100644
--- a/googleapiclient/discovery_cache/documents/apigateway.v1.json
+++ b/googleapiclient/discovery_cache/documents/apigateway.v1.json
@@ -1083,7 +1083,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210714",
   "rootUrl": "https://apigateway.googleapis.com/",
   "schemas": {
     "ApigatewayApi": {
diff --git a/googleapiclient/discovery_cache/documents/apigateway.v1beta.json b/googleapiclient/discovery_cache/documents/apigateway.v1beta.json
index 7f31b95..a19a7c0 100644
--- a/googleapiclient/discovery_cache/documents/apigateway.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/apigateway.v1beta.json
@@ -1083,7 +1083,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210721",
   "rootUrl": "https://apigateway.googleapis.com/",
   "schemas": {
     "ApigatewayApi": {
diff --git a/googleapiclient/discovery_cache/documents/apigee.v1.json b/googleapiclient/discovery_cache/documents/apigee.v1.json
index 4a6a992..53ccfec 100644
--- a/googleapiclient/discovery_cache/documents/apigee.v1.json
+++ b/googleapiclient/discovery_cache/documents/apigee.v1.json
@@ -7011,7 +7011,7 @@
       }
     }
   },
-  "revision": "20210708",
+  "revision": "20210719",
   "rootUrl": "https://apigee.googleapis.com/",
   "schemas": {
     "GoogleApiHttpBody": {
diff --git a/googleapiclient/discovery_cache/documents/apikeys.v2.json b/googleapiclient/discovery_cache/documents/apikeys.v2.json
index bb40ea8..8d8e4f9 100644
--- a/googleapiclient/discovery_cache/documents/apikeys.v2.json
+++ b/googleapiclient/discovery_cache/documents/apikeys.v2.json
@@ -424,7 +424,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://apikeys.googleapis.com/",
   "schemas": {
     "Operation": {
diff --git a/googleapiclient/discovery_cache/documents/appengine.v1.json b/googleapiclient/discovery_cache/documents/appengine.v1.json
index a3c7840..47591e4 100644
--- a/googleapiclient/discovery_cache/documents/appengine.v1.json
+++ b/googleapiclient/discovery_cache/documents/appengine.v1.json
@@ -1595,7 +1595,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210715",
   "rootUrl": "https://appengine.googleapis.com/",
   "schemas": {
     "ApiConfigHandler": {
diff --git a/googleapiclient/discovery_cache/documents/appengine.v1alpha.json b/googleapiclient/discovery_cache/documents/appengine.v1alpha.json
index 6e773d6..c513cd0 100644
--- a/googleapiclient/discovery_cache/documents/appengine.v1alpha.json
+++ b/googleapiclient/discovery_cache/documents/appengine.v1alpha.json
@@ -709,7 +709,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210715",
   "rootUrl": "https://appengine.googleapis.com/",
   "schemas": {
     "AuthorizedCertificate": {
diff --git a/googleapiclient/discovery_cache/documents/appengine.v1beta.json b/googleapiclient/discovery_cache/documents/appengine.v1beta.json
index f863cb6..5a51e99 100644
--- a/googleapiclient/discovery_cache/documents/appengine.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/appengine.v1beta.json
@@ -1595,7 +1595,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210715",
   "rootUrl": "https://appengine.googleapis.com/",
   "schemas": {
     "ApiConfigHandler": {
diff --git a/googleapiclient/discovery_cache/documents/area120tables.v1alpha1.json b/googleapiclient/discovery_cache/documents/area120tables.v1alpha1.json
index a90a4a4..800d20a 100644
--- a/googleapiclient/discovery_cache/documents/area120tables.v1alpha1.json
+++ b/googleapiclient/discovery_cache/documents/area120tables.v1alpha1.json
@@ -586,7 +586,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://area120tables.googleapis.com/",
   "schemas": {
     "BatchCreateRowsRequest": {
diff --git a/googleapiclient/discovery_cache/documents/artifactregistry.v1.json b/googleapiclient/discovery_cache/documents/artifactregistry.v1.json
index d33ae7f..5535f54 100644
--- a/googleapiclient/discovery_cache/documents/artifactregistry.v1.json
+++ b/googleapiclient/discovery_cache/documents/artifactregistry.v1.json
@@ -348,7 +348,7 @@
       }
     }
   },
-  "revision": "20210629",
+  "revision": "20210713",
   "rootUrl": "https://artifactregistry.googleapis.com/",
   "schemas": {
     "AptArtifact": {
diff --git a/googleapiclient/discovery_cache/documents/artifactregistry.v1beta1.json b/googleapiclient/discovery_cache/documents/artifactregistry.v1beta1.json
index 551d57c..dd50d78 100644
--- a/googleapiclient/discovery_cache/documents/artifactregistry.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/artifactregistry.v1beta1.json
@@ -971,7 +971,7 @@
       }
     }
   },
-  "revision": "20210629",
+  "revision": "20210713",
   "rootUrl": "https://artifactregistry.googleapis.com/",
   "schemas": {
     "AptArtifact": {
diff --git a/googleapiclient/discovery_cache/documents/artifactregistry.v1beta2.json b/googleapiclient/discovery_cache/documents/artifactregistry.v1beta2.json
index b1e655f..7d365ee 100644
--- a/googleapiclient/discovery_cache/documents/artifactregistry.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/artifactregistry.v1beta2.json
@@ -1035,7 +1035,7 @@
       }
     }
   },
-  "revision": "20210629",
+  "revision": "20210713",
   "rootUrl": "https://artifactregistry.googleapis.com/",
   "schemas": {
     "AptArtifact": {
diff --git a/googleapiclient/discovery_cache/documents/bigquery.v2.json b/googleapiclient/discovery_cache/documents/bigquery.v2.json
index fbf1764..fc5d063 100644
--- a/googleapiclient/discovery_cache/documents/bigquery.v2.json
+++ b/googleapiclient/discovery_cache/documents/bigquery.v2.json
@@ -1683,7 +1683,7 @@
       }
     }
   },
-  "revision": "20210617",
+  "revision": "20210706",
   "rootUrl": "https://bigquery.googleapis.com/",
   "schemas": {
     "AggregateClassificationMetrics": {
diff --git a/googleapiclient/discovery_cache/documents/bigqueryconnection.v1beta1.json b/googleapiclient/discovery_cache/documents/bigqueryconnection.v1beta1.json
index 2480c6d..7caa9e5 100644
--- a/googleapiclient/discovery_cache/documents/bigqueryconnection.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/bigqueryconnection.v1beta1.json
@@ -395,7 +395,7 @@
       }
     }
   },
-  "revision": "20210617",
+  "revision": "20210706",
   "rootUrl": "https://bigqueryconnection.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/bigqueryreservation.v1.json b/googleapiclient/discovery_cache/documents/bigqueryreservation.v1.json
index fd592c8..7f374e9 100644
--- a/googleapiclient/discovery_cache/documents/bigqueryreservation.v1.json
+++ b/googleapiclient/discovery_cache/documents/bigqueryreservation.v1.json
@@ -783,7 +783,7 @@
       }
     }
   },
-  "revision": "20210618",
+  "revision": "20210717",
   "rootUrl": "https://bigqueryreservation.googleapis.com/",
   "schemas": {
     "Assignment": {
diff --git a/googleapiclient/discovery_cache/documents/bigqueryreservation.v1beta1.json b/googleapiclient/discovery_cache/documents/bigqueryreservation.v1beta1.json
index 33710c5..8b59733 100644
--- a/googleapiclient/discovery_cache/documents/bigqueryreservation.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/bigqueryreservation.v1beta1.json
@@ -781,7 +781,7 @@
       }
     }
   },
-  "revision": "20210618",
+  "revision": "20210717",
   "rootUrl": "https://bigqueryreservation.googleapis.com/",
   "schemas": {
     "Assignment": {
diff --git a/googleapiclient/discovery_cache/documents/bigtableadmin.v1.json b/googleapiclient/discovery_cache/documents/bigtableadmin.v1.json
index bd78e85..898ad24 100644
--- a/googleapiclient/discovery_cache/documents/bigtableadmin.v1.json
+++ b/googleapiclient/discovery_cache/documents/bigtableadmin.v1.json
@@ -96,7 +96,7 @@
   },
   "protocol": "rest",
   "resources": {},
-  "revision": "20210623",
+  "revision": "20210712",
   "rootUrl": "https://bigtableadmin.googleapis.com/",
   "schemas": {
     "Backup": {
diff --git a/googleapiclient/discovery_cache/documents/bigtableadmin.v2.json b/googleapiclient/discovery_cache/documents/bigtableadmin.v2.json
index 3fa2952..d04354d 100644
--- a/googleapiclient/discovery_cache/documents/bigtableadmin.v2.json
+++ b/googleapiclient/discovery_cache/documents/bigtableadmin.v2.json
@@ -1803,7 +1803,7 @@
       }
     }
   },
-  "revision": "20210623",
+  "revision": "20210712",
   "rootUrl": "https://bigtableadmin.googleapis.com/",
   "schemas": {
     "AppProfile": {
diff --git a/googleapiclient/discovery_cache/documents/billingbudgets.v1.json b/googleapiclient/discovery_cache/documents/billingbudgets.v1.json
index b1e6458..ddc9e20 100644
--- a/googleapiclient/discovery_cache/documents/billingbudgets.v1.json
+++ b/googleapiclient/discovery_cache/documents/billingbudgets.v1.json
@@ -270,7 +270,7 @@
       }
     }
   },
-  "revision": "20210703",
+  "revision": "20210720",
   "rootUrl": "https://billingbudgets.googleapis.com/",
   "schemas": {
     "GoogleCloudBillingBudgetsV1Budget": {
diff --git a/googleapiclient/discovery_cache/documents/billingbudgets.v1beta1.json b/googleapiclient/discovery_cache/documents/billingbudgets.v1beta1.json
index f4e725a..7bcd96d 100644
--- a/googleapiclient/discovery_cache/documents/billingbudgets.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/billingbudgets.v1beta1.json
@@ -264,7 +264,7 @@
       }
     }
   },
-  "revision": "20210703",
+  "revision": "20210720",
   "rootUrl": "https://billingbudgets.googleapis.com/",
   "schemas": {
     "GoogleCloudBillingBudgetsV1beta1AllUpdatesRule": {
diff --git a/googleapiclient/discovery_cache/documents/binaryauthorization.v1.json b/googleapiclient/discovery_cache/documents/binaryauthorization.v1.json
index 0b5c94c..b1f64fb 100644
--- a/googleapiclient/discovery_cache/documents/binaryauthorization.v1.json
+++ b/googleapiclient/discovery_cache/documents/binaryauthorization.v1.json
@@ -551,7 +551,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://binaryauthorization.googleapis.com/",
   "schemas": {
     "AdmissionRule": {
diff --git a/googleapiclient/discovery_cache/documents/binaryauthorization.v1beta1.json b/googleapiclient/discovery_cache/documents/binaryauthorization.v1beta1.json
index 84082d5..5569f93 100644
--- a/googleapiclient/discovery_cache/documents/binaryauthorization.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/binaryauthorization.v1beta1.json
@@ -551,7 +551,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://binaryauthorization.googleapis.com/",
   "schemas": {
     "AdmissionRule": {
diff --git a/googleapiclient/discovery_cache/documents/blogger.v2.json b/googleapiclient/discovery_cache/documents/blogger.v2.json
index 08c17eb..9516953 100644
--- a/googleapiclient/discovery_cache/documents/blogger.v2.json
+++ b/googleapiclient/discovery_cache/documents/blogger.v2.json
@@ -401,7 +401,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://blogger.googleapis.com/",
   "schemas": {
     "Blog": {
diff --git a/googleapiclient/discovery_cache/documents/blogger.v3.json b/googleapiclient/discovery_cache/documents/blogger.v3.json
index 3b0ccfc..9fc4f53 100644
--- a/googleapiclient/discovery_cache/documents/blogger.v3.json
+++ b/googleapiclient/discovery_cache/documents/blogger.v3.json
@@ -1678,7 +1678,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://blogger.googleapis.com/",
   "schemas": {
     "Blog": {
diff --git a/googleapiclient/discovery_cache/documents/books.v1.json b/googleapiclient/discovery_cache/documents/books.v1.json
index a0752e5..72024b2 100644
--- a/googleapiclient/discovery_cache/documents/books.v1.json
+++ b/googleapiclient/discovery_cache/documents/books.v1.json
@@ -2671,7 +2671,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210721",
   "rootUrl": "https://books.googleapis.com/",
   "schemas": {
     "Annotation": {
diff --git a/googleapiclient/discovery_cache/documents/calendar.v3.json b/googleapiclient/discovery_cache/documents/calendar.v3.json
index 6c142c8..c21719b 100644
--- a/googleapiclient/discovery_cache/documents/calendar.v3.json
+++ b/googleapiclient/discovery_cache/documents/calendar.v3.json
@@ -1723,7 +1723,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210718",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "Acl": {
diff --git a/googleapiclient/discovery_cache/documents/chat.v1.json b/googleapiclient/discovery_cache/documents/chat.v1.json
index 3c8d04c..336fb8b 100644
--- a/googleapiclient/discovery_cache/documents/chat.v1.json
+++ b/googleapiclient/discovery_cache/documents/chat.v1.json
@@ -601,7 +601,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://chat.googleapis.com/",
   "schemas": {
     "ActionParameter": {
@@ -623,6 +623,10 @@
       "description": "Parameters that a bot can use to configure how it's response is posted.",
       "id": "ActionResponse",
       "properties": {
+        "dialogAction": {
+          "$ref": "DialogAction",
+          "description": "This response is for Dialog related events and must be accompanied by ResponseType.Dialog"
+        },
         "type": {
           "description": "The type of bot response.",
           "enum": [
@@ -646,6 +650,59 @@
       },
       "type": "object"
     },
+    "ActionStatus": {
+      "description": "ActionStatus represents status of a request from the bot developer's side. In specific, for each request a bot gets, the bot developer will set both fields below in relation to what the response status and message related to status should be.",
+      "id": "ActionStatus",
+      "properties": {
+        "statusCode": {
+          "description": "The status code.",
+          "enum": [
+            "OK",
+            "CANCELLED",
+            "UNKNOWN",
+            "INVALID_ARGUMENT",
+            "DEADLINE_EXCEEDED",
+            "NOT_FOUND",
+            "ALREADY_EXISTS",
+            "PERMISSION_DENIED",
+            "UNAUTHENTICATED",
+            "RESOURCE_EXHAUSTED",
+            "FAILED_PRECONDITION",
+            "ABORTED",
+            "OUT_OF_RANGE",
+            "UNIMPLEMENTED",
+            "INTERNAL",
+            "UNAVAILABLE",
+            "DATA_LOSS"
+          ],
+          "enumDescriptions": [
+            "Not an error; returned on success HTTP Mapping: 200 OK",
+            "The operation was cancelled, typically by the caller. HTTP Mapping: 499 Client Closed Request",
+            "Unknown error. For example, this error may be returned when a `Status` value received from another address space belongs to an error space that is not known in this address space. Also errors raised by APIs that do not return enough error information may be converted to this error. HTTP Mapping: 500 Internal Server Error",
+            "The client specified an invalid argument. Note that this differs from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments that are problematic regardless of the state of the system (e.g., a malformed file name). HTTP Mapping: 400 Bad Request",
+            "The deadline expired before the operation could complete. For operations that change the state of the system, this error may be returned even if the operation has completed successfully. For example, a successful response from a server could have been delayed long enough for the deadline to expire. HTTP Mapping: 504 Gateway Timeout",
+            "Some requested entity (e.g., file or directory) was not found. Note to server developers: if a request is denied for an entire class of users, such as gradual feature rollout or undocumented allowlist, `NOT_FOUND` may be used. If a request is denied for some users within a class of users, such as user-based access control, `PERMISSION_DENIED` must be used. HTTP Mapping: 404 Not Found",
+            "The entity that a client attempted to create (e.g., file or directory) already exists. HTTP Mapping: 409 Conflict",
+            "The caller does not have permission to execute the specified operation. `PERMISSION_DENIED` must not be used for rejections caused by exhausting some resource (use `RESOURCE_EXHAUSTED` instead for those errors). `PERMISSION_DENIED` must not be used if the caller can not be identified (use `UNAUTHENTICATED` instead for those errors). This error code does not imply the request is valid or the requested entity exists or satisfies other pre-conditions. HTTP Mapping: 403 Forbidden",
+            "The request does not have valid authentication credentials for the operation. HTTP Mapping: 401 Unauthorized",
+            "Some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system is out of space. HTTP Mapping: 429 Too Many Requests",
+            "The operation was rejected because the system is not in a state required for the operation's execution. For example, the directory to be deleted is non-empty, an rmdir operation is applied to a non-directory, etc. Service implementors can use the following guidelines to decide between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: (a) Use `UNAVAILABLE` if the client can retry just the failing call. (b) Use `ABORTED` if the client should retry at a higher level. For example, when a client-specified test-and-set fails, indicating the client should restart a read-modify-write sequence. (c) Use `FAILED_PRECONDITION` if the client should not retry until the system state has been explicitly fixed. For example, if an \"rmdir\" fails because the directory is non-empty, `FAILED_PRECONDITION` should be returned since the client should not retry unless the files are deleted from the directory. HTTP Mapping: 400 Bad Request",
+            "The operation was aborted, typically due to a concurrency issue such as a sequencer check failure or transaction abort. See the guidelines above for deciding between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`. HTTP Mapping: 409 Conflict",
+            "The operation was attempted past the valid range. E.g., seeking or reading past end-of-file. Unlike `INVALID_ARGUMENT`, this error indicates a problem that may be fixed if the system state changes. For example, a 32-bit file system will generate `INVALID_ARGUMENT` if asked to read at an offset that is not in the range [0,2^32-1], but it will generate `OUT_OF_RANGE` if asked to read from an offset past the current file size. There is a fair bit of overlap between `FAILED_PRECONDITION` and `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific error) when it applies so that callers who are iterating through a space can easily look for an `OUT_OF_RANGE` error to detect when they are done. HTTP Mapping: 400 Bad Request",
+            "The operation is not implemented or is not supported/enabled in this service. HTTP Mapping: 501 Not Implemented",
+            "Internal errors. This means that some invariants expected by the underlying system have been broken. This error code is reserved for serious errors. HTTP Mapping: 500 Internal Server Error",
+            "The service is currently unavailable. This is most likely a transient condition, which can be corrected by retrying with a backoff. Note that it is not always safe to retry non-idempotent operations. See the guidelines above for deciding between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`. HTTP Mapping: 503 Service Unavailable",
+            "Unrecoverable data loss or corruption. HTTP Mapping: 500 Internal Server Error"
+          ],
+          "type": "string"
+        },
+        "userFacingMessage": {
+          "description": "This message will be the corresponding string to the above status_code. If unset, an appropriate generic message based on the status_code will be shown to the user. If this field is set then the message will be surfaced to the user for both successes and errors.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "Annotation": {
       "description": "Annotations associated with the plain-text body of the message. Example plain-text message body: ``` Hello @FooBot how are you!\" ``` The corresponding annotations metadata: ``` \"annotations\":[{ \"type\":\"USER_MENTION\", \"startIndex\":6, \"length\":7, \"userMention\": { \"user\": { \"name\":\"users/107946847022116401880\", \"displayName\":\"FooBot\", \"avatarUrl\":\"https://goo.gl/aeDtrS\", \"type\":\"BOT\" }, \"type\":\"MENTION\" } }] ```",
       "id": "Annotation",
@@ -836,6 +893,33 @@
       },
       "type": "object"
     },
+    "Color": {
+      "description": "Represents a color in the RGBA color space. This representation is designed for simplicity of conversion to/from color representations in various languages over compactness. For example, the fields of this representation can be trivially provided to the constructor of `java.awt.Color` in Java; it can also be trivially provided to UIColor's `+colorWithRed:green:blue:alpha` method in iOS; and, with just a little work, it can be easily formatted into a CSS `rgba()` string in JavaScript. This reference page doesn't carry information about the absolute color space that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color space. When color equality needs to be decided, implementations, unless documented otherwise, treat two colors as equal if all their red, green, blue, and alpha values each differ by at most 1e-5. Example (Java): import com.google.type.Color; // ... public static java.awt.Color fromProto(Color protocolor) { float alpha = protocolor.hasAlpha() ? protocolor.getAlpha().getValue() : 1.0; return new java.awt.Color( protocolor.getRed(), protocolor.getGreen(), protocolor.getBlue(), alpha); } public static Color toProto(java.awt.Color color) { float red = (float) color.getRed(); float green = (float) color.getGreen(); float blue = (float) color.getBlue(); float denominator = 255.0; Color.Builder resultBuilder = Color .newBuilder() .setRed(red / denominator) .setGreen(green / denominator) .setBlue(blue / denominator); int alpha = color.getAlpha(); if (alpha != 255) { result.setAlpha( FloatValue .newBuilder() .setValue(((float) alpha) / denominator) .build()); } return resultBuilder.build(); } // ... Example (iOS / Obj-C): // ... static UIColor* fromProto(Color* protocolor) { float red = [protocolor red]; float green = [protocolor green]; float blue = [protocolor blue]; FloatValue* alpha_wrapper = [protocolor alpha]; float alpha = 1.0; if (alpha_wrapper != nil) { alpha = [alpha_wrapper value]; } return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } static Color* toProto(UIColor* color) { CGFloat red, green, blue, alpha; if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) { return nil; } Color* result = [[Color alloc] init]; [result setRed:red]; [result setGreen:green]; [result setBlue:blue]; if (alpha <= 0.9999) { [result setAlpha:floatWrapperWithValue(alpha)]; } [result autorelease]; return result; } // ... Example (JavaScript): // ... var protoToCssColor = function(rgb_color) { var redFrac = rgb_color.red || 0.0; var greenFrac = rgb_color.green || 0.0; var blueFrac = rgb_color.blue || 0.0; var red = Math.floor(redFrac * 255); var green = Math.floor(greenFrac * 255); var blue = Math.floor(blueFrac * 255); if (!('alpha' in rgb_color)) { return rgbToCssColor(red, green, blue); } var alphaFrac = rgb_color.alpha.value || 0.0; var rgbParams = [red, green, blue].join(','); return ['rgba(', rgbParams, ',', alphaFrac, ')'].join(''); }; var rgbToCssColor = function(red, green, blue) { var rgbNumber = new Number((red << 16) | (green << 8) | blue); var hexString = rgbNumber.toString(16); var missingZeros = 6 - hexString.length; var resultBuilder = ['#']; for (var i = 0; i < missingZeros; i++) { resultBuilder.push('0'); } resultBuilder.push(hexString); return resultBuilder.join(''); }; // ...",
+      "id": "Color",
+      "properties": {
+        "alpha": {
+          "description": "The fraction of this color that should be applied to the pixel. That is, the final pixel color is defined by the equation: `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` This means that a value of 1.0 corresponds to a solid color, whereas a value of 0.0 corresponds to a completely transparent color. This uses a wrapper message rather than a simple float scalar so that it is possible to distinguish between a default value and the value being unset. If omitted, this color object is rendered as a solid color (as if the alpha value had been explicitly given a value of 1.0).",
+          "format": "float",
+          "type": "number"
+        },
+        "blue": {
+          "description": "The amount of blue in the color as a value in the interval [0, 1].",
+          "format": "float",
+          "type": "number"
+        },
+        "green": {
+          "description": "The amount of green in the color as a value in the interval [0, 1].",
+          "format": "float",
+          "type": "number"
+        },
+        "red": {
+          "description": "The amount of red in the color as a value in the interval [0, 1].",
+          "format": "float",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
     "DeprecatedEvent": {
       "description": "Google Chat events.",
       "id": "DeprecatedEvent",
@@ -894,6 +978,32 @@
       },
       "type": "object"
     },
+    "Dialog": {
+      "description": "Wrapper around the card body of the dialog.",
+      "id": "Dialog",
+      "properties": {
+        "body": {
+          "$ref": "GoogleAppsCardV1Card",
+          "description": "Body of the dialog, which will be rendered in a modal. NOTE: The following fields within the objects are not supported: google.apps.card.v1.Widget.date_time_picker google.apps.card.v1.DecoratedText.SwitchControl.on_change_action google.apps.card.v1.TextInput.on_change_action google.apps.card.v1.SelectionInput.on_change_action google.apps.card.v1.DateTimePicker.on_change_action Setting the fields above will have no effect on the dialog."
+        }
+      },
+      "type": "object"
+    },
+    "DialogAction": {
+      "description": "Contains dialog if present as well as the ActionStatus for the request sent from user.",
+      "id": "DialogAction",
+      "properties": {
+        "actionStatus": {
+          "$ref": "ActionStatus",
+          "description": "Status for either invoke dialog or submit dialog requests. This will be used to display a status and message to user if needed. For example in case of an error or success."
+        },
+        "dialog": {
+          "$ref": "Dialog",
+          "description": "Dialog for the request."
+        }
+      },
+      "type": "object"
+    },
     "DriveDataRef": {
       "description": "A reference to the data of a drive attachment.",
       "id": "DriveDataRef",
@@ -929,6 +1039,840 @@
       },
       "type": "object"
     },
+    "GoogleAppsCardV1Action": {
+      "description": "An action that describes the behavior when the form is submitted. For example, an Apps Script can be invoked to handle the form.",
+      "id": "GoogleAppsCardV1Action",
+      "properties": {
+        "function": {
+          "description": "Apps Script function to invoke when the containing element is clicked/activated.",
+          "type": "string"
+        },
+        "loadIndicator": {
+          "enum": [
+            "SPINNER",
+            "NONE"
+          ],
+          "enumDescriptions": [
+            "Displays a spinner to indicate that content is loading.",
+            "Nothing is displayed."
+          ],
+          "type": "string"
+        },
+        "parameters": {
+          "description": "List of action parameters.",
+          "items": {
+            "$ref": "GoogleAppsCardV1ActionParameter"
+          },
+          "type": "array"
+        },
+        "persistValues": {
+          "description": "Indicates whether form values persist after the action. The default value is `false`. If `true`, form values remain after the action is triggered. When using [LoadIndicator.NONE](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for actions, `persist_values` = `true`is recommended, as it ensures that any changes made by the user after form or on change actions are sent to the server are not overwritten by the response. If `false`, the form values are cleared when the action is triggered. When `persist_values` is set to `false`, it is strongly recommended that the card use [LoadIndicator.SPINNER](workspace/add-ons/reference/rpc/google.apps.card.v1#loadindicator) for all actions, as this locks the UI to ensure no changes are made by the user while the action is being processed.",
+          "type": "boolean"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1ActionParameter": {
+      "description": "List of string parameters to supply when the action method is invoked. For example, consider three snooze buttons: snooze now, snooze 1 day, snooze next week. You might use action method = snooze(), passing the snooze type and snooze time in the list of string parameters.",
+      "id": "GoogleAppsCardV1ActionParameter",
+      "properties": {
+        "key": {
+          "description": "The name of the parameter for the action script.",
+          "type": "string"
+        },
+        "value": {
+          "description": "The value of the parameter.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1BorderStyle": {
+      "description": "Represents the complete border style applied to widgets.",
+      "id": "GoogleAppsCardV1BorderStyle",
+      "properties": {
+        "cornerRadius": {
+          "description": "The corner radius for the border.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "strokeColor": {
+          "$ref": "Color",
+          "description": "The colors to use when the type is `BORDER_TYPE_STROKE`."
+        },
+        "type": {
+          "description": "The border type.",
+          "enum": [
+            "BORDER_TYPE_UNSPECIFIED",
+            "NO_BORDER",
+            "STROKE"
+          ],
+          "enumDescriptions": [
+            "No value specified.",
+            "No border.",
+            "Outline."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1Button": {
+      "description": "A button. Can be a text button or an image button.",
+      "id": "GoogleAppsCardV1Button",
+      "properties": {
+        "altText": {
+          "description": "The alternative text used for accessibility. Has no effect when an icon is set; use `icon.alt_text` instead.",
+          "type": "string"
+        },
+        "color": {
+          "$ref": "Color",
+          "description": "If set, the button is filled with a solid background."
+        },
+        "disabled": {
+          "description": "If true, the button is displayed in a disabled state and doesn't respond to user actions.",
+          "type": "boolean"
+        },
+        "icon": {
+          "$ref": "GoogleAppsCardV1Icon",
+          "description": "The icon image."
+        },
+        "onClick": {
+          "$ref": "GoogleAppsCardV1OnClick",
+          "description": "The action to perform when the button is clicked."
+        },
+        "text": {
+          "description": "The text of the button.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1ButtonList": {
+      "description": "A list of buttons layed out horizontally.",
+      "id": "GoogleAppsCardV1ButtonList",
+      "properties": {
+        "buttons": {
+          "items": {
+            "$ref": "GoogleAppsCardV1Button"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1Card": {
+      "description": "A card is a UI element that can contain UI widgets such as text and images. For more information, see Cards . For example, the following JSON creates a card that has a header with the name, position, icons, and link for a contact, followed by a section with contact information like email and phone number. ``` { \"header\": { \"title\": \"Heba Salam\", \"subtitle\": \"Software Engineer\", \"imageStyle\": \"ImageStyle.AVATAR\", \"imageUrl\": \"https://example.com/heba_salam.png\", \"imageAltText\": \"Avatar for Heba Salam\" }, \"sections\" : [ { \"header\": \"Contact Info\", \"widgets\": [ { \"decorated_text\": { \"icon\": { \"knownIcon\": \"EMAIL\" }, \"content\": \"heba.salam@example.com\" } }, { \"decoratedText\": { \"icon\": { \"knownIcon\": \"PERSON\" }, \"content\": \"Online\" } }, { \"decoratedText\": { \"icon\": { \"knownIcon\": \"PHONE\" }, \"content\": \"+1 (555) 555-1234\" } }, { \"buttons\": [ { \"textButton\": { \"text\": \"Share\", }, \"onClick\": { \"openLink\": { \"url\": \"https://example.com/share\" } } }, { \"textButton\": { \"text\": \"Edit\", }, \"onClick\": { \"action\": { \"function\": \"goToView\", \"parameters\": [ { \"key\": \"viewType\", \"value\": \"EDIT\" } ], \"loadIndicator\": \"LoadIndicator.SPINNER\" } } } ] } ], \"collapsible\": true, \"uncollapsibleWidgetsCount\": 3 } ], \"cardActions\": [ { \"actionLabel\": \"Send Feedback\", \"onClick\": { \"openLink\": { \"url\": \"https://example.com/feedback\" } } } ], \"name\": \"contact-card-K3wB6arF2H9L\" } ```",
+      "id": "GoogleAppsCardV1Card",
+      "properties": {
+        "cardActions": {
+          "description": "The actions of this card. They are added to a card's generated toolbar menu. For example, the following JSON constructs a card action menu with Settings and Send Feedback options: ``` \"card_actions\": [ { \"actionLabel\": \"Setting\", \"onClick\": { \"action\": { \"functionName\": \"goToView\", \"parameters\": [ { \"key\": \"viewType\", \"value\": \"SETTING\" } ], \"loadIndicator\": \"LoadIndicator.SPINNER\" } } }, { \"actionLabel\": \"Send Feedback\", \"onClick\": { \"openLink\": { \"url\": \"https://example.com/feedback\" } } } ] ```",
+          "items": {
+            "$ref": "GoogleAppsCardV1CardAction"
+          },
+          "type": "array"
+        },
+        "displayStyle": {
+          "description": "The display style for peekCardHeader.",
+          "enum": [
+            "DISPLAY_STYLE_UNSPECIFIED",
+            "PEEK",
+            "REPLACE"
+          ],
+          "enumDescriptions": [
+            "",
+            "The header of the card appears at the bottom of the sidebar, partially covering the current top card of the stack. Clicking the header pops the card into the card stack. If the card has no header, a generated header is used instead.",
+            "The card is shown by replacing the view of the top card in the card stack."
+          ],
+          "type": "string"
+        },
+        "fixedFooter": {
+          "$ref": "GoogleAppsCardV1CardFixedFooter",
+          "description": "The fixed footer shown at the bottom of this card."
+        },
+        "header": {
+          "$ref": "GoogleAppsCardV1CardHeader",
+          "description": "The header of the card. A header usually contains a title and an image."
+        },
+        "name": {
+          "description": "Name of the card, which is used as a identifier for the card in card navigation.",
+          "type": "string"
+        },
+        "peekCardHeader": {
+          "$ref": "GoogleAppsCardV1CardHeader",
+          "description": "When displaying contextual content, the peek card header acts as a placeholder so that the user can navigate forward between the homepage cards and the contextual cards."
+        },
+        "sections": {
+          "description": "Sections are separated by a line divider.",
+          "items": {
+            "$ref": "GoogleAppsCardV1Section"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1CardAction": {
+      "description": "A card action is the action associated with the card. For example, an invoice card might include actions such as delete invoice, email invoice, or open the invoice in a browser.",
+      "id": "GoogleAppsCardV1CardAction",
+      "properties": {
+        "actionLabel": {
+          "description": "The label that displays as the action menu item.",
+          "type": "string"
+        },
+        "onClick": {
+          "$ref": "GoogleAppsCardV1OnClick",
+          "description": "The onclick action for this action item."
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1CardFixedFooter": {
+      "description": "A persistent (sticky) footer that is added to the bottom of the card.",
+      "id": "GoogleAppsCardV1CardFixedFooter",
+      "properties": {
+        "primaryButton": {
+          "$ref": "GoogleAppsCardV1Button",
+          "description": "The primary button of the fixed footer. The button must be a text button with text and color set."
+        },
+        "secondaryButton": {
+          "$ref": "GoogleAppsCardV1Button",
+          "description": "The secondary button of the fixed footer. The button must be a text button with text and color set. `primaryButton` must be set if `secondaryButton` is set."
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1CardHeader": {
+      "id": "GoogleAppsCardV1CardHeader",
+      "properties": {
+        "imageAltText": {
+          "description": "The alternative text of this image which is used for accessibility.",
+          "type": "string"
+        },
+        "imageType": {
+          "description": "The image's type.",
+          "enum": [
+            "SQUARE",
+            "CIRCLE"
+          ],
+          "enumDescriptions": [
+            "Applies no cropping to the image.",
+            "Applies a circular mask to the image."
+          ],
+          "type": "string"
+        },
+        "imageUrl": {
+          "description": "The URL of the image in the card header.",
+          "type": "string"
+        },
+        "subtitle": {
+          "description": "The subtitle of the card header.",
+          "type": "string"
+        },
+        "title": {
+          "description": "The title of the card header. The title must be specified. The header has a fixed height: if both a title and subtitle are specified, each takes up one line. If only the title is specified, it takes up both lines.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1DateTimePicker": {
+      "description": "The widget that lets users to specify a date and time.",
+      "id": "GoogleAppsCardV1DateTimePicker",
+      "properties": {
+        "label": {
+          "description": "The label for the field that displays to the user.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the text input that's used in formInput, and uniquely identifies this input.",
+          "type": "string"
+        },
+        "onChangeAction": {
+          "$ref": "GoogleAppsCardV1Action",
+          "description": "Triggered when the user clicks Save or Clear from the date/time picker dialog. This is only triggered if the value changed as a result of the Save/Clear operation."
+        },
+        "timezoneOffsetDate": {
+          "description": "The number representing the time zone offset from UTC, in minutes. If set, the `value_ms_epoch` is displayed in the specified time zone. If not set, it uses the user's time zone setting on the client side.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "type": {
+          "description": "The type of the date/time picker.",
+          "enum": [
+            "DATE_AND_TIME",
+            "DATE_ONLY",
+            "TIME_ONLY"
+          ],
+          "enumDescriptions": [
+            "The user can select a date and time.",
+            "The user can only select a date.",
+            "The user can only select a time."
+          ],
+          "type": "string"
+        },
+        "valueMsEpoch": {
+          "description": "The value to display as the default value before user input or previous user input. It is represented in milliseconds (Epoch time). For `DATE_AND_TIME` type, the full epoch value is used. For `DATE_ONLY` type, only date of the epoch time is used. For `TIME_ONLY` type, only time of the epoch time is used. For example, you can set epoch time to `3 * 60 * 60 * 1000` to represent 3am.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1DecoratedText": {
+      "description": "A widget that displays text with optional decorations such as a label above or below the text, an icon in front of the text, a selection widget or a button after the text.",
+      "id": "GoogleAppsCardV1DecoratedText",
+      "properties": {
+        "bottomLabel": {
+          "description": "The formatted text label that shows below the main text.",
+          "type": "string"
+        },
+        "button": {
+          "$ref": "GoogleAppsCardV1Button",
+          "description": "A button that can be clicked to trigger an action."
+        },
+        "endIcon": {
+          "$ref": "GoogleAppsCardV1Icon",
+          "description": "An icon displayed after the text."
+        },
+        "icon": {
+          "$ref": "GoogleAppsCardV1Icon",
+          "description": "Deprecated in favor of start_icon."
+        },
+        "onClick": {
+          "$ref": "GoogleAppsCardV1OnClick",
+          "description": "Only the top and bottom label and content region are clickable."
+        },
+        "startIcon": {
+          "$ref": "GoogleAppsCardV1Icon",
+          "description": "The icon displayed in front of the text."
+        },
+        "switchControl": {
+          "$ref": "GoogleAppsCardV1SwitchControl",
+          "description": "A switch widget can be clicked to change its state or trigger an action."
+        },
+        "text": {
+          "description": "Required. The main widget formatted text. See Text formatting for details.",
+          "type": "string"
+        },
+        "topLabel": {
+          "description": "The formatted text label that shows above the main text.",
+          "type": "string"
+        },
+        "wrapText": {
+          "description": "The wrap text setting. If `true`, the text is wrapped and displayed in multiline. Otherwise, the text is truncated.",
+          "type": "boolean"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1Divider": {
+      "description": "A divider that appears in between widgets.",
+      "id": "GoogleAppsCardV1Divider",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleAppsCardV1Grid": {
+      "description": "Represents a Grid widget that displays items in a configurable grid layout.",
+      "id": "GoogleAppsCardV1Grid",
+      "properties": {
+        "borderStyle": {
+          "$ref": "GoogleAppsCardV1BorderStyle",
+          "description": "The border style to apply to each grid item."
+        },
+        "columnCount": {
+          "description": "The number of columns to display in the grid. A default value is used if this field isn't specified, and that default value is different depending on where the grid is shown (dialog versus companion).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "items": {
+          "description": "The items to display in the grid.",
+          "items": {
+            "$ref": "GoogleAppsCardV1GridItem"
+          },
+          "type": "array"
+        },
+        "onClick": {
+          "$ref": "GoogleAppsCardV1OnClick",
+          "description": "This callback is reused by each individual grid item, but with the item's identifier and index in the items list added to the callback's parameters."
+        },
+        "title": {
+          "description": "The text that displays in the grid header.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1GridItem": {
+      "description": "Represents a single item in the grid layout.",
+      "id": "GoogleAppsCardV1GridItem",
+      "properties": {
+        "id": {
+          "description": "A user-specified identifier for this grid item. This identifier is returned in the parent Grid's onClick callback parameters.",
+          "type": "string"
+        },
+        "image": {
+          "$ref": "GoogleAppsCardV1ImageComponent",
+          "description": "The image that displays in the grid item."
+        },
+        "layout": {
+          "description": "The layout to use for the grid item.",
+          "enum": [
+            "GRID_ITEM_LAYOUT_UNSPECIFIED",
+            "TEXT_BELOW",
+            "TEXT_ABOVE"
+          ],
+          "enumDescriptions": [
+            "No layout specified.",
+            "The title and subtitle are shown below the grid item's image.",
+            "The title and subtitle are shown above the grid item's image."
+          ],
+          "type": "string"
+        },
+        "subtitle": {
+          "description": "The grid item's subtitle.",
+          "type": "string"
+        },
+        "textAlignment": {
+          "description": "The horizontal alignment of the grid item's text.",
+          "enum": [
+            "HORIZONTAL_ALIGNMENT_UNSPECIFIED",
+            "START",
+            "CENTER",
+            "END"
+          ],
+          "enumDescriptions": [
+            "Unspecified alignment.",
+            "Alignment to the start position.",
+            "Alignment to the center position.",
+            "Alignment to the end position."
+          ],
+          "type": "string"
+        },
+        "title": {
+          "description": "The grid item's title.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1Icon": {
+      "id": "GoogleAppsCardV1Icon",
+      "properties": {
+        "altText": {
+          "description": "The description of the icon, used for accessibility. The default value is provided if you don't specify one.",
+          "type": "string"
+        },
+        "iconUrl": {
+          "description": "The icon specified by a URL.",
+          "type": "string"
+        },
+        "imageType": {
+          "description": "The crop style applied to the image. In some cases, applying a `CIRCLE` crop causes the image to be drawn larger than a standard icon.",
+          "enum": [
+            "SQUARE",
+            "CIRCLE"
+          ],
+          "enumDescriptions": [
+            "Applies no cropping to the image.",
+            "Applies a circular mask to the image."
+          ],
+          "type": "string"
+        },
+        "knownIcon": {
+          "description": "The icon specified by the string name of a list of known icons",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1Image": {
+      "description": "An image that is specified by a URL and can have an onClick action.",
+      "id": "GoogleAppsCardV1Image",
+      "properties": {
+        "altText": {
+          "description": "The alternative text of this image, used for accessibility.",
+          "type": "string"
+        },
+        "imageUrl": {
+          "description": "An image URL.",
+          "type": "string"
+        },
+        "onClick": {
+          "$ref": "GoogleAppsCardV1OnClick"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1ImageComponent": {
+      "id": "GoogleAppsCardV1ImageComponent",
+      "properties": {
+        "altText": {
+          "description": "The accessibility label for the image.",
+          "type": "string"
+        },
+        "borderStyle": {
+          "$ref": "GoogleAppsCardV1BorderStyle",
+          "description": "The border style to apply to the image."
+        },
+        "cropStyle": {
+          "$ref": "GoogleAppsCardV1ImageCropStyle",
+          "description": "The crop style to apply to the image."
+        },
+        "imageUri": {
+          "description": "The image URL.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1ImageCropStyle": {
+      "description": "Represents the crop style applied to an image.",
+      "id": "GoogleAppsCardV1ImageCropStyle",
+      "properties": {
+        "aspectRatio": {
+          "description": "The aspect ratio to use if the crop type is `RECTANGLE_CUSTOM`.",
+          "format": "double",
+          "type": "number"
+        },
+        "type": {
+          "description": "The crop type.",
+          "enum": [
+            "IMAGE_CROP_TYPE_UNSPECIFIED",
+            "SQUARE",
+            "CIRCLE",
+            "RECTANGLE_CUSTOM",
+            "RECTANGLE_4_3"
+          ],
+          "enumDescriptions": [
+            "No value specified.",
+            "Applies a square crop.",
+            "Applies a circular crop.",
+            "Applies a rectangular crop with a custom aspect ratio.",
+            "Applies a rectangular crop with a 4:3 aspect ratio."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1OnClick": {
+      "id": "GoogleAppsCardV1OnClick",
+      "properties": {
+        "action": {
+          "$ref": "GoogleAppsCardV1Action",
+          "description": "If specified, an action is triggered by this onClick."
+        },
+        "card": {
+          "$ref": "GoogleAppsCardV1Card",
+          "description": "A new card is pushed to the card stack after clicking if specified."
+        },
+        "openDynamicLinkAction": {
+          "$ref": "GoogleAppsCardV1Action",
+          "description": "An add-on triggers this action when the action needs to open a link. This differs from the open_link above in that this needs to talk to server to get the link. Thus some preparation work is required for web client to do before the open link action response comes back."
+        },
+        "openLink": {
+          "$ref": "GoogleAppsCardV1OpenLink",
+          "description": "If specified, this onClick triggers an open link action."
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1OpenLink": {
+      "id": "GoogleAppsCardV1OpenLink",
+      "properties": {
+        "onClose": {
+          "enum": [
+            "NOTHING",
+            "RELOAD"
+          ],
+          "enumDescriptions": [
+            "Doesn\u2019t reload the card after the child window closes. Reloads the card after the child window closes. If used in conjunction with [OpenAs.OVERLAY](/workspace/add-ons/reference/rpc/google.apps.card.v1#openas), the child window acts as a modal dialog and the main card is blocked until the child window closes.",
+            ""
+          ],
+          "type": "string"
+        },
+        "openAs": {
+          "enum": [
+            "FULL_SIZE",
+            "OVERLAY"
+          ],
+          "enumDescriptions": [
+            "The link opens as a full size window (if that's the frame used by the client.",
+            "The link opens as an overlay, such as a pop-up."
+          ],
+          "type": "string"
+        },
+        "url": {
+          "description": "The URL to open.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1Section": {
+      "description": "A section contains a collection of widgets that are rendered vertically in the order that they are specified. Across all platforms, cards have a narrow fixed width, so there is currently no need for layout properties, for example, float.",
+      "id": "GoogleAppsCardV1Section",
+      "properties": {
+        "collapsible": {
+          "description": "Indicates whether this section is collapsible. If a section is collapsible, the description must be given.",
+          "type": "boolean"
+        },
+        "header": {
+          "description": "The header of the section. Formatted text is supported.",
+          "type": "string"
+        },
+        "uncollapsibleWidgetsCount": {
+          "description": "The number of uncollapsible widgets. For example, when a section contains five widgets and the `numUncollapsibleWidget` is set to `2`, the first two widgets are always shown and the last three are collapsed as default. The `numUncollapsibleWidget` is taken into account only when collapsible is set to `true`.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "widgets": {
+          "description": "A section must contain at least 1 widget.",
+          "items": {
+            "$ref": "GoogleAppsCardV1Widget"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1SelectionInput": {
+      "description": "A widget that creates a UI item (for example, a drop-down list) with options for users to select.",
+      "id": "GoogleAppsCardV1SelectionInput",
+      "properties": {
+        "items": {
+          "items": {
+            "$ref": "GoogleAppsCardV1SelectionItem"
+          },
+          "type": "array"
+        },
+        "label": {
+          "description": "The label displayed ahead of the switch control.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the text input which is used in formInput.",
+          "type": "string"
+        },
+        "onChangeAction": {
+          "$ref": "GoogleAppsCardV1Action",
+          "description": "If specified, the form is submitted when the selection changes. If not specified, you must specify a separate button."
+        },
+        "type": {
+          "enum": [
+            "CHECK_BOX",
+            "RADIO_BUTTON",
+            "SWITCH",
+            "DROPDOWN"
+          ],
+          "enumDescriptions": [
+            "The selection type is a checkbox.",
+            "The selection type is a radio button.",
+            "The selection type is a switch.",
+            "The selection type is a dropdown."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1SelectionItem": {
+      "description": "The item in the switch control. A radio button, at most one of the items is selected.",
+      "id": "GoogleAppsCardV1SelectionItem",
+      "properties": {
+        "selected": {
+          "description": "If more than one item is selected for `RADIO_BUTTON` and `DROPDOWN`, the first selected item is treated as selected and the ones after are ignored.",
+          "type": "boolean"
+        },
+        "text": {
+          "description": "The text to be displayed.",
+          "type": "string"
+        },
+        "value": {
+          "description": "The value associated with this item. The client should use this as a form input value.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1SuggestionItem": {
+      "description": "A suggestion item. Only supports text for now.",
+      "id": "GoogleAppsCardV1SuggestionItem",
+      "properties": {
+        "text": {
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1Suggestions": {
+      "description": "A container wrapping elements necessary for showing suggestion items used in text input autocomplete.",
+      "id": "GoogleAppsCardV1Suggestions",
+      "properties": {
+        "items": {
+          "description": "A list of suggestions items which will be used in are used in autocomplete.",
+          "items": {
+            "$ref": "GoogleAppsCardV1SuggestionItem"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1SwitchControl": {
+      "id": "GoogleAppsCardV1SwitchControl",
+      "properties": {
+        "controlType": {
+          "description": "The control type, either switch or checkbox.",
+          "enum": [
+            "SWITCH",
+            "CHECKBOX",
+            "CHECK_BOX"
+          ],
+          "enumDescriptions": [
+            "",
+            "Deprecated in favor of `CHECK_BOX`.",
+            ""
+          ],
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the switch widget that's used in formInput.",
+          "type": "string"
+        },
+        "onChangeAction": {
+          "$ref": "GoogleAppsCardV1Action",
+          "description": "The action when the switch state is changed."
+        },
+        "selected": {
+          "description": "If the switch is selected.",
+          "type": "boolean"
+        },
+        "value": {
+          "description": "The value is what is passed back in the callback.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1TextInput": {
+      "description": "A text input is a UI item where users can input text. A text input can also have an onChange action and suggestions.",
+      "id": "GoogleAppsCardV1TextInput",
+      "properties": {
+        "autoCompleteAction": {
+          "$ref": "GoogleAppsCardV1Action",
+          "description": "The refresh function that returns suggestions based on the user's input text. If the callback is not specified, autocomplete is done in client side based on the initial suggestion items."
+        },
+        "hintText": {
+          "description": "The hint text.",
+          "type": "string"
+        },
+        "initialSuggestions": {
+          "$ref": "GoogleAppsCardV1Suggestions",
+          "description": "The initial suggestions made before any user input."
+        },
+        "label": {
+          "description": "At least one of label and hintText must be specified.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the text input which is used in formInput.",
+          "type": "string"
+        },
+        "onChangeAction": {
+          "$ref": "GoogleAppsCardV1Action",
+          "description": "The onChange action, for example, invoke a function."
+        },
+        "type": {
+          "description": "The style of the text, for example, a single line or multiple lines.",
+          "enum": [
+            "SINGLE_LINE",
+            "MULTIPLE_LINE"
+          ],
+          "enumDescriptions": [
+            "The text is put into a single line.",
+            "The text is put into multiple lines."
+          ],
+          "type": "string"
+        },
+        "value": {
+          "description": "The default value when there is no input from the user.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1TextParagraph": {
+      "description": "A paragraph of text that supports formatting. See [Text formatting](workspace/add-ons/concepts/widgets#text_formatting\") for details.",
+      "id": "GoogleAppsCardV1TextParagraph",
+      "properties": {
+        "text": {
+          "description": "The text that's shown in the widget.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleAppsCardV1Widget": {
+      "description": "A widget is a UI element that presents texts, images, etc.",
+      "id": "GoogleAppsCardV1Widget",
+      "properties": {
+        "buttonList": {
+          "$ref": "GoogleAppsCardV1ButtonList",
+          "description": "A list of buttons. For example, the following JSON creates two buttons. The first is a filled text button and the second is an image button that opens a link: ``` \"buttonList\": { \"buttons\": [ \"button\": { \"text\": \"Edit\", \"Color\": { \"Red\": 255 \"Green\": 255 \"Blue\": 255 } \"disabled\": true }, \"button\": { \"icon\": { \"knownIcon\": \"INVITE\" \"altText\": \"check calendar\" }, \"onClick\": { \"openLink\": { \"url\": \"https://example.com/calendar\" } } }, ] } ```"
+        },
+        "dateTimePicker": {
+          "$ref": "GoogleAppsCardV1DateTimePicker",
+          "description": "Displays a selection/input widget for date/time. For example, the following JSON creates a date/time picker for an appointment time: ``` \"date_time_picker\": { \"name\": \"appointment_time\", \"label\": \"Book your appointment at:\", \"type\": \"DateTimePickerType.DATE_AND_TIME\", \"valueMsEpoch\": \"796435200000\" } ```"
+        },
+        "decoratedText": {
+          "$ref": "GoogleAppsCardV1DecoratedText",
+          "description": "Displays a decorated text item in this widget. For example, the following JSON creates a decorated text widget showing email address: ``` \"decoratedText\": { \"icon\": { \"knownIcon\": \"EMAIL\" }, \"topLabel\": \"Email Address\", \"content\": \"heba.salam@example.com\", \"bottomLabel\": \"This is a new Email address!\", \"switchWidget\": { \"name\": \"has_send_welcome_email_to_heba_salam\", \"selected\": false, \"controlType\": \"ControlType.CHECKBOX\" } } ```"
+        },
+        "divider": {
+          "$ref": "GoogleAppsCardV1Divider",
+          "description": "Displays a divider. For example, the following JSON creates a divider: ``` \"divider\": { } ```"
+        },
+        "grid": {
+          "$ref": "GoogleAppsCardV1Grid",
+          "description": "Displays a grid with a collection of items. For example, the following JSON creates a 2 column grid with a single item: ``` \"grid\": { \"title\": \"A fine collection of items\", \"numColumns\": 2, \"borderStyle\": { \"type\": \"STROKE\", \"cornerRadius\": 4.0 }, \"items\": [ \"image\": { \"imageUri\": \"https://www.example.com/image.png\", \"cropStyle\": { \"type\": \"SQUARE\" }, \"borderStyle\": { \"type\": \"STROKE\" } }, \"title\": \"An item\", \"textAlignment\": \"CENTER\" ], \"onClick\": { \"openLink\": { \"url\":\"https://www.example.com\" } } } ```"
+        },
+        "horizontalAlignment": {
+          "description": "The horizontal alignment of this widget.",
+          "enum": [
+            "HORIZONTAL_ALIGNMENT_UNSPECIFIED",
+            "START",
+            "CENTER",
+            "END"
+          ],
+          "enumDescriptions": [
+            "Unspecified alignment.",
+            "Alignment to the start position.",
+            "Alignment to the center position.",
+            "Alignment to the end position."
+          ],
+          "type": "string"
+        },
+        "image": {
+          "$ref": "GoogleAppsCardV1Image",
+          "description": "Displays an image in this widget. For example, the following JSON creates an image with alternative text: ``` \"image\": { \"imageUrl\": \"https://example.com/heba_salam.png\" \"altText\": \"Avatar for Heba Salam\" } ```"
+        },
+        "selectionInput": {
+          "$ref": "GoogleAppsCardV1SelectionInput",
+          "description": "Displays a switch control in this widget. For example, the following JSON creates a dropdown selection for size: ``` \"switchControl\": { \"name\": \"size\", \"label\": \"Size\" \"type\": \"SelectionType.DROPDOWN\", \"items\": [ { \"text\": \"S\", \"value\": \"small\", \"selected\": false }, { \"text\": \"M\", \"value\": \"medium\", \"selected\": true }, { \"text\": \"L\", \"value\": \"large\", \"selected\": false }, { \"text\": \"XL\", \"value\": \"extra_large\", \"selected\": false } ] } ```"
+        },
+        "textInput": {
+          "$ref": "GoogleAppsCardV1TextInput",
+          "description": "Displays a text input in this widget. For example, the following JSON creates a text input for mail address: ``` \"textInput\": { \"name\": \"mailing_address\", \"label\": \"Mailing Address\" } ``` As another example, the following JSON creates a text input for programming language with static suggestions: ``` \"textInput\": { \"name\": \"preferred_programing_language\", \"label\": \"Preferred Language\", \"initialSuggestions\": { \"items\": [ { \"text\": \"C++\" }, { \"text\": \"Java\" }, { \"text\": \"JavaScript\" }, { \"text\": \"Python\" } ] } } ```"
+        },
+        "textParagraph": {
+          "$ref": "GoogleAppsCardV1TextParagraph",
+          "description": "Displays a text paragraph in this widget. For example, the following JSON creates a bolded text: ``` \"textParagraph\": { \"text\": \" *bold text*\" } ```"
+        }
+      },
+      "type": "object"
+    },
     "Image": {
       "description": "An image that is specified by a URL and can have an onclick action.",
       "id": "Image",
diff --git a/googleapiclient/discovery_cache/documents/chromemanagement.v1.json b/googleapiclient/discovery_cache/documents/chromemanagement.v1.json
index 86ccfde..d07a826 100644
--- a/googleapiclient/discovery_cache/documents/chromemanagement.v1.json
+++ b/googleapiclient/discovery_cache/documents/chromemanagement.v1.json
@@ -288,7 +288,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://chromemanagement.googleapis.com/",
   "schemas": {
     "GoogleChromeManagementV1BrowserVersion": {
diff --git a/googleapiclient/discovery_cache/documents/chromepolicy.v1.json b/googleapiclient/discovery_cache/documents/chromepolicy.v1.json
index 6d07e6f..5fcf25d 100644
--- a/googleapiclient/discovery_cache/documents/chromepolicy.v1.json
+++ b/googleapiclient/discovery_cache/documents/chromepolicy.v1.json
@@ -324,7 +324,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://chromepolicy.googleapis.com/",
   "schemas": {
     "GoogleChromePolicyV1AdditionalTargetKeyName": {
diff --git a/googleapiclient/discovery_cache/documents/chromeuxreport.v1.json b/googleapiclient/discovery_cache/documents/chromeuxreport.v1.json
index d7dcae1..2b11b1a 100644
--- a/googleapiclient/discovery_cache/documents/chromeuxreport.v1.json
+++ b/googleapiclient/discovery_cache/documents/chromeuxreport.v1.json
@@ -116,7 +116,7 @@
       }
     }
   },
-  "revision": "20210715",
+  "revision": "20210721",
   "rootUrl": "https://chromeuxreport.googleapis.com/",
   "schemas": {
     "Bin": {
diff --git a/googleapiclient/discovery_cache/documents/classroom.v1.json b/googleapiclient/discovery_cache/documents/classroom.v1.json
index 3dbe5ef..5d4d4e4 100644
--- a/googleapiclient/discovery_cache/documents/classroom.v1.json
+++ b/googleapiclient/discovery_cache/documents/classroom.v1.json
@@ -2400,7 +2400,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210721",
   "rootUrl": "https://classroom.googleapis.com/",
   "schemas": {
     "Announcement": {
diff --git a/googleapiclient/discovery_cache/documents/cloudasset.v1.json b/googleapiclient/discovery_cache/documents/cloudasset.v1.json
index f331c25..2ed3294 100644
--- a/googleapiclient/discovery_cache/documents/cloudasset.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudasset.v1.json
@@ -434,7 +434,7 @@
           ]
         },
         "analyzeIamPolicyLongrunning": {
-          "description": "Analyzes IAM policies asynchronously to answer which identities have what accesses on which resources, and writes the analysis results to a Google Cloud Storage or a BigQuery destination. For Cloud Storage destination, the output format is the JSON format that represents a AnalyzeIamPolicyResponse. This method implements the google.longrunning.Operation, which allows you to track the operation status. We recommend intervals of at least 2 seconds with exponential backoff retry to poll the operation result. The metadata contains the request to help callers to map responses to requests.",
+          "description": "Analyzes IAM policies asynchronously to answer which identities have what accesses on which resources, and writes the analysis results to a Google Cloud Storage or a BigQuery destination. For Cloud Storage destination, the output format is the JSON format that represents a AnalyzeIamPolicyResponse. This method implements the google.longrunning.Operation, which allows you to track the operation status. We recommend intervals of at least 2 seconds with exponential backoff retry to poll the operation result. The metadata contains the metadata for the long-running operation.",
           "flatPath": "v1/{v1Id}/{v1Id1}:analyzeIamPolicyLongrunning",
           "httpMethod": "POST",
           "id": "cloudasset.analyzeIamPolicyLongrunning",
@@ -711,7 +711,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://cloudasset.googleapis.com/",
   "schemas": {
     "AccessSelector": {
diff --git a/googleapiclient/discovery_cache/documents/cloudasset.v1beta1.json b/googleapiclient/discovery_cache/documents/cloudasset.v1beta1.json
index b5f8c63..e951397 100644
--- a/googleapiclient/discovery_cache/documents/cloudasset.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudasset.v1beta1.json
@@ -411,7 +411,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://cloudasset.googleapis.com/",
   "schemas": {
     "AnalyzeIamPolicyLongrunningResponse": {
diff --git a/googleapiclient/discovery_cache/documents/cloudasset.v1p1beta1.json b/googleapiclient/discovery_cache/documents/cloudasset.v1p1beta1.json
index 151353b..65498f2 100644
--- a/googleapiclient/discovery_cache/documents/cloudasset.v1p1beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudasset.v1p1beta1.json
@@ -207,7 +207,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://cloudasset.googleapis.com/",
   "schemas": {
     "AnalyzeIamPolicyLongrunningResponse": {
diff --git a/googleapiclient/discovery_cache/documents/cloudasset.v1p4beta1.json b/googleapiclient/discovery_cache/documents/cloudasset.v1p4beta1.json
index 59261e3..b1f82bd 100644
--- a/googleapiclient/discovery_cache/documents/cloudasset.v1p4beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudasset.v1p4beta1.json
@@ -221,7 +221,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://cloudasset.googleapis.com/",
   "schemas": {
     "AccessSelector": {
diff --git a/googleapiclient/discovery_cache/documents/cloudasset.v1p5beta1.json b/googleapiclient/discovery_cache/documents/cloudasset.v1p5beta1.json
index 32a797f..7c9a444 100644
--- a/googleapiclient/discovery_cache/documents/cloudasset.v1p5beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudasset.v1p5beta1.json
@@ -177,7 +177,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://cloudasset.googleapis.com/",
   "schemas": {
     "AnalyzeIamPolicyLongrunningResponse": {
diff --git a/googleapiclient/discovery_cache/documents/cloudasset.v1p7beta1.json b/googleapiclient/discovery_cache/documents/cloudasset.v1p7beta1.json
index 960ca02..aa2ba6f 100644
--- a/googleapiclient/discovery_cache/documents/cloudasset.v1p7beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudasset.v1p7beta1.json
@@ -167,7 +167,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://cloudasset.googleapis.com/",
   "schemas": {
     "AnalyzeIamPolicyLongrunningResponse": {
diff --git a/googleapiclient/discovery_cache/documents/cloudbuild.v1.json b/googleapiclient/discovery_cache/documents/cloudbuild.v1.json
index 017d37d..57f24c7 100644
--- a/googleapiclient/discovery_cache/documents/cloudbuild.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudbuild.v1.json
@@ -962,7 +962,7 @@
                       "type": "string"
                     },
                     "parent": {
-                      "description": "Required. The parent of the collection of `WorkerPools`. Format: `projects/{project}/locations/location`.",
+                      "description": "Required. The parent of the collection of `WorkerPools`. Format: `projects/{project}/locations/{location}`.",
                       "location": "path",
                       "pattern": "^projects/[^/]+/locations/[^/]+$",
                       "required": true,
@@ -1285,7 +1285,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210715",
   "rootUrl": "https://cloudbuild.googleapis.com/",
   "schemas": {
     "ArtifactObjects": {
@@ -1370,6 +1370,11 @@
           "readOnly": true,
           "type": "string"
         },
+        "failureInfo": {
+          "$ref": "FailureInfo",
+          "description": "Output only. Contains information about the build when status=FAILURE.",
+          "readOnly": true
+        },
         "finishTime": {
           "description": "Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build's execution.",
           "format": "google-datetime",
@@ -1842,6 +1847,10 @@
           "description": "The `Trigger` name with format: `projects/{project}/locations/{location}/triggers/{trigger}`, where {trigger} is a unique identifier generated by the service.",
           "type": "string"
         },
+        "sourceToBuild": {
+          "$ref": "GitRepoSource",
+          "description": "The repo and ref of the repository from which to build. This field is used only for those triggers that do not respond to SCM events. Triggers that respond to such events build source at whatever commit caused the event. This field is currently only used by Webhook, Pub/Sub, Manual, and Cron triggers."
+        },
         "substitutions": {
           "additionalProperties": {
             "type": "string"
@@ -1960,6 +1969,39 @@
       "properties": {},
       "type": "object"
     },
+    "FailureInfo": {
+      "description": "A fatal problem encountered during the execution of the build.",
+      "id": "FailureInfo",
+      "properties": {
+        "detail": {
+          "description": "Explains the failure issue in more detail using hard-coded text.",
+          "type": "string"
+        },
+        "type": {
+          "description": "The name of the failure.",
+          "enum": [
+            "FAILURE_TYPE_UNSPECIFIED",
+            "PUSH_FAILED",
+            "PUSH_IMAGE_NOT_FOUND",
+            "PUSH_NOT_AUTHORIZED",
+            "LOGGING_FAILURE",
+            "USER_BUILD_STEP",
+            "FETCH_SOURCE_FAILED"
+          ],
+          "enumDescriptions": [
+            "Type unspecified",
+            "Unable to push the image to the repository.",
+            "Final image not found.",
+            "Unauthorized push of the final image.",
+            "Backend logging failures. Should retry.",
+            "A build step has failed.",
+            "The source fetching has failed."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "FileHashes": {
       "description": "Container message for hashes of byte content of files, used in SourceProvenance messages to verify integrity of source input to the build.",
       "id": "FileHashes",
@@ -2002,6 +2044,79 @@
       },
       "type": "object"
     },
+    "GitRepoSource": {
+      "description": "GitRepoSource describes a repo and ref of a code repository.",
+      "id": "GitRepoSource",
+      "properties": {
+        "ref": {
+          "description": "The branch or tag to use. Must start with \"refs/\" (required).",
+          "type": "string"
+        },
+        "repoType": {
+          "description": "See RepoType below.",
+          "enum": [
+            "UNKNOWN",
+            "CLOUD_SOURCE_REPOSITORIES",
+            "GITHUB"
+          ],
+          "enumDescriptions": [
+            "The default, unknown repo type.",
+            "A Google Cloud Source Repositories-hosted repo.",
+            "A GitHub-hosted repo not necessarily on \"github.com\" (i.e. GitHub Enterprise)."
+          ],
+          "type": "string"
+        },
+        "uri": {
+          "description": "The URI of the repo (required).",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleDevtoolsCloudbuildV2OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "id": "GoogleDevtoolsCloudbuildV2OperationMetadata",
+      "properties": {
+        "apiVersion": {
+          "description": "Output only. API version used to start the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "createTime": {
+          "description": "Output only. The time the operation was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Output only. The time the operation finished running.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "requestedCancellation": {
+          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+          "readOnly": true,
+          "type": "boolean"
+        },
+        "statusMessage": {
+          "description": "Output only. Human-readable status of the operation, if any.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "target": {
+          "description": "Output only. Server-defined resource path for the target of the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "verb": {
+          "description": "Output only. Name of the verb executed by the operation.",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "HTTPDelivery": {
       "description": "HTTPDelivery is the delivery configuration for an HTTP notification.",
       "id": "HTTPDelivery",
@@ -2312,6 +2427,50 @@
       },
       "type": "object"
     },
+    "OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "id": "OperationMetadata",
+      "properties": {
+        "apiVersion": {
+          "description": "Output only. API version used to start the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "cancelRequested": {
+          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+          "readOnly": true,
+          "type": "boolean"
+        },
+        "createTime": {
+          "description": "Output only. The time the operation was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Output only. The time the operation finished running.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "statusDetail": {
+          "description": "Output only. Human-readable status of the operation, if any.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "target": {
+          "description": "Output only. Server-defined resource path for the target of the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "verb": {
+          "description": "Output only. Name of the verb executed by the operation.",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "PoolOption": {
       "description": "Details about how a build should be executed on a `WorkerPool`. See [running builds in a private pool](https://cloud.google.com/build/docs/private-pools/run-builds-in-private-pool) for more information.",
       "id": "PoolOption",
diff --git a/googleapiclient/discovery_cache/documents/cloudbuild.v1alpha1.json b/googleapiclient/discovery_cache/documents/cloudbuild.v1alpha1.json
index 3835528..d2f5bc6 100644
--- a/googleapiclient/discovery_cache/documents/cloudbuild.v1alpha1.json
+++ b/googleapiclient/discovery_cache/documents/cloudbuild.v1alpha1.json
@@ -306,7 +306,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210715",
   "rootUrl": "https://cloudbuild.googleapis.com/",
   "schemas": {
     "ArtifactObjects": {
@@ -391,6 +391,11 @@
           "readOnly": true,
           "type": "string"
         },
+        "failureInfo": {
+          "$ref": "FailureInfo",
+          "description": "Output only. Contains information about the build when status=FAILURE.",
+          "readOnly": true
+        },
         "finishTime": {
           "description": "Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build's execution.",
           "format": "google-datetime",
@@ -868,6 +873,39 @@
       "properties": {},
       "type": "object"
     },
+    "FailureInfo": {
+      "description": "A fatal problem encountered during the execution of the build.",
+      "id": "FailureInfo",
+      "properties": {
+        "detail": {
+          "description": "Explains the failure issue in more detail using hard-coded text.",
+          "type": "string"
+        },
+        "type": {
+          "description": "The name of the failure.",
+          "enum": [
+            "FAILURE_TYPE_UNSPECIFIED",
+            "PUSH_FAILED",
+            "PUSH_IMAGE_NOT_FOUND",
+            "PUSH_NOT_AUTHORIZED",
+            "LOGGING_FAILURE",
+            "USER_BUILD_STEP",
+            "FETCH_SOURCE_FAILED"
+          ],
+          "enumDescriptions": [
+            "Type unspecified",
+            "Unable to push the image to the repository.",
+            "Final image not found.",
+            "Unauthorized push of the final image.",
+            "Backend logging failures. Should retry.",
+            "A build step has failed.",
+            "The source fetching has failed."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "FileHashes": {
       "description": "Container message for hashes of byte content of files, used in SourceProvenance messages to verify integrity of source input to the build.",
       "id": "FileHashes",
@@ -882,6 +920,50 @@
       },
       "type": "object"
     },
+    "GoogleDevtoolsCloudbuildV2OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "id": "GoogleDevtoolsCloudbuildV2OperationMetadata",
+      "properties": {
+        "apiVersion": {
+          "description": "Output only. API version used to start the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "createTime": {
+          "description": "Output only. The time the operation was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Output only. The time the operation finished running.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "requestedCancellation": {
+          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+          "readOnly": true,
+          "type": "boolean"
+        },
+        "statusMessage": {
+          "description": "Output only. Human-readable status of the operation, if any.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "target": {
+          "description": "Output only. Server-defined resource path for the target of the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "verb": {
+          "description": "Output only. Name of the verb executed by the operation.",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "HTTPDelivery": {
       "description": "HTTPDelivery is the delivery configuration for an HTTP notification.",
       "id": "HTTPDelivery",
@@ -1119,6 +1201,50 @@
       },
       "type": "object"
     },
+    "OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "id": "OperationMetadata",
+      "properties": {
+        "apiVersion": {
+          "description": "Output only. API version used to start the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "cancelRequested": {
+          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+          "readOnly": true,
+          "type": "boolean"
+        },
+        "createTime": {
+          "description": "Output only. The time the operation was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Output only. The time the operation finished running.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "statusDetail": {
+          "description": "Output only. Human-readable status of the operation, if any.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "target": {
+          "description": "Output only. Server-defined resource path for the target of the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "verb": {
+          "description": "Output only. Name of the verb executed by the operation.",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "PoolOption": {
       "description": "Details about how a build should be executed on a `WorkerPool`. See [running builds in a private pool](https://cloud.google.com/build/docs/private-pools/run-builds-in-private-pool) for more information.",
       "id": "PoolOption",
diff --git a/googleapiclient/discovery_cache/documents/cloudbuild.v1alpha2.json b/googleapiclient/discovery_cache/documents/cloudbuild.v1alpha2.json
index 31ad237..91b6b16 100644
--- a/googleapiclient/discovery_cache/documents/cloudbuild.v1alpha2.json
+++ b/googleapiclient/discovery_cache/documents/cloudbuild.v1alpha2.json
@@ -317,7 +317,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210715",
   "rootUrl": "https://cloudbuild.googleapis.com/",
   "schemas": {
     "ArtifactObjects": {
@@ -402,6 +402,11 @@
           "readOnly": true,
           "type": "string"
         },
+        "failureInfo": {
+          "$ref": "FailureInfo",
+          "description": "Output only. Contains information about the build when status=FAILURE.",
+          "readOnly": true
+        },
         "finishTime": {
           "description": "Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build's execution.",
           "format": "google-datetime",
@@ -879,6 +884,39 @@
       "properties": {},
       "type": "object"
     },
+    "FailureInfo": {
+      "description": "A fatal problem encountered during the execution of the build.",
+      "id": "FailureInfo",
+      "properties": {
+        "detail": {
+          "description": "Explains the failure issue in more detail using hard-coded text.",
+          "type": "string"
+        },
+        "type": {
+          "description": "The name of the failure.",
+          "enum": [
+            "FAILURE_TYPE_UNSPECIFIED",
+            "PUSH_FAILED",
+            "PUSH_IMAGE_NOT_FOUND",
+            "PUSH_NOT_AUTHORIZED",
+            "LOGGING_FAILURE",
+            "USER_BUILD_STEP",
+            "FETCH_SOURCE_FAILED"
+          ],
+          "enumDescriptions": [
+            "Type unspecified",
+            "Unable to push the image to the repository.",
+            "Final image not found.",
+            "Unauthorized push of the final image.",
+            "Backend logging failures. Should retry.",
+            "A build step has failed.",
+            "The source fetching has failed."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "FileHashes": {
       "description": "Container message for hashes of byte content of files, used in SourceProvenance messages to verify integrity of source input to the build.",
       "id": "FileHashes",
@@ -893,6 +931,50 @@
       },
       "type": "object"
     },
+    "GoogleDevtoolsCloudbuildV2OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "id": "GoogleDevtoolsCloudbuildV2OperationMetadata",
+      "properties": {
+        "apiVersion": {
+          "description": "Output only. API version used to start the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "createTime": {
+          "description": "Output only. The time the operation was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Output only. The time the operation finished running.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "requestedCancellation": {
+          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+          "readOnly": true,
+          "type": "boolean"
+        },
+        "statusMessage": {
+          "description": "Output only. Human-readable status of the operation, if any.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "target": {
+          "description": "Output only. Server-defined resource path for the target of the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "verb": {
+          "description": "Output only. Name of the verb executed by the operation.",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "HTTPDelivery": {
       "description": "HTTPDelivery is the delivery configuration for an HTTP notification.",
       "id": "HTTPDelivery",
@@ -1122,6 +1204,50 @@
       },
       "type": "object"
     },
+    "OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "id": "OperationMetadata",
+      "properties": {
+        "apiVersion": {
+          "description": "Output only. API version used to start the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "cancelRequested": {
+          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+          "readOnly": true,
+          "type": "boolean"
+        },
+        "createTime": {
+          "description": "Output only. The time the operation was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Output only. The time the operation finished running.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "statusDetail": {
+          "description": "Output only. Human-readable status of the operation, if any.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "target": {
+          "description": "Output only. Server-defined resource path for the target of the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "verb": {
+          "description": "Output only. Name of the verb executed by the operation.",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "PoolOption": {
       "description": "Details about how a build should be executed on a `WorkerPool`. See [running builds in a private pool](https://cloud.google.com/build/docs/private-pools/run-builds-in-private-pool) for more information.",
       "id": "PoolOption",
diff --git a/googleapiclient/discovery_cache/documents/cloudbuild.v1beta1.json b/googleapiclient/discovery_cache/documents/cloudbuild.v1beta1.json
index debc918..60fc26e 100644
--- a/googleapiclient/discovery_cache/documents/cloudbuild.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudbuild.v1beta1.json
@@ -317,7 +317,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210715",
   "rootUrl": "https://cloudbuild.googleapis.com/",
   "schemas": {
     "ArtifactObjects": {
@@ -402,6 +402,11 @@
           "readOnly": true,
           "type": "string"
         },
+        "failureInfo": {
+          "$ref": "FailureInfo",
+          "description": "Output only. Contains information about the build when status=FAILURE.",
+          "readOnly": true
+        },
         "finishTime": {
           "description": "Output only. Time at which execution of the build was finished. The difference between finish_time and start_time is the duration of the build's execution.",
           "format": "google-datetime",
@@ -879,6 +884,39 @@
       "properties": {},
       "type": "object"
     },
+    "FailureInfo": {
+      "description": "A fatal problem encountered during the execution of the build.",
+      "id": "FailureInfo",
+      "properties": {
+        "detail": {
+          "description": "Explains the failure issue in more detail using hard-coded text.",
+          "type": "string"
+        },
+        "type": {
+          "description": "The name of the failure.",
+          "enum": [
+            "FAILURE_TYPE_UNSPECIFIED",
+            "PUSH_FAILED",
+            "PUSH_IMAGE_NOT_FOUND",
+            "PUSH_NOT_AUTHORIZED",
+            "LOGGING_FAILURE",
+            "USER_BUILD_STEP",
+            "FETCH_SOURCE_FAILED"
+          ],
+          "enumDescriptions": [
+            "Type unspecified",
+            "Unable to push the image to the repository.",
+            "Final image not found.",
+            "Unauthorized push of the final image.",
+            "Backend logging failures. Should retry.",
+            "A build step has failed.",
+            "The source fetching has failed."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "FileHashes": {
       "description": "Container message for hashes of byte content of files, used in SourceProvenance messages to verify integrity of source input to the build.",
       "id": "FileHashes",
@@ -893,6 +931,50 @@
       },
       "type": "object"
     },
+    "GoogleDevtoolsCloudbuildV2OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "id": "GoogleDevtoolsCloudbuildV2OperationMetadata",
+      "properties": {
+        "apiVersion": {
+          "description": "Output only. API version used to start the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "createTime": {
+          "description": "Output only. The time the operation was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Output only. The time the operation finished running.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "requestedCancellation": {
+          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+          "readOnly": true,
+          "type": "boolean"
+        },
+        "statusMessage": {
+          "description": "Output only. Human-readable status of the operation, if any.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "target": {
+          "description": "Output only. Server-defined resource path for the target of the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "verb": {
+          "description": "Output only. Name of the verb executed by the operation.",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "HTTPDelivery": {
       "description": "HTTPDelivery is the delivery configuration for an HTTP notification.",
       "id": "HTTPDelivery",
@@ -1122,6 +1204,50 @@
       },
       "type": "object"
     },
+    "OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "id": "OperationMetadata",
+      "properties": {
+        "apiVersion": {
+          "description": "Output only. API version used to start the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "cancelRequested": {
+          "description": "Output only. Identifies whether the user has requested cancellation of the operation. Operations that have successfully been cancelled have Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+          "readOnly": true,
+          "type": "boolean"
+        },
+        "createTime": {
+          "description": "Output only. The time the operation was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Output only. The time the operation finished running.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "statusDetail": {
+          "description": "Output only. Human-readable status of the operation, if any.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "target": {
+          "description": "Output only. Server-defined resource path for the target of the operation.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "verb": {
+          "description": "Output only. Name of the verb executed by the operation.",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "PoolOption": {
       "description": "Details about how a build should be executed on a `WorkerPool`. See [running builds in a private pool](https://cloud.google.com/build/docs/private-pools/run-builds-in-private-pool) for more information.",
       "id": "PoolOption",
diff --git a/googleapiclient/discovery_cache/documents/cloudchannel.v1.json b/googleapiclient/discovery_cache/documents/cloudchannel.v1.json
index 93d26bf..c54d5fa 100644
--- a/googleapiclient/discovery_cache/documents/cloudchannel.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudchannel.v1.json
@@ -1533,7 +1533,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://cloudchannel.googleapis.com/",
   "schemas": {
     "GoogleCloudChannelV1ActivateEntitlementRequest": {
diff --git a/googleapiclient/discovery_cache/documents/clouddebugger.v2.json b/googleapiclient/discovery_cache/documents/clouddebugger.v2.json
index c6961e0..f230c90 100644
--- a/googleapiclient/discovery_cache/documents/clouddebugger.v2.json
+++ b/googleapiclient/discovery_cache/documents/clouddebugger.v2.json
@@ -448,7 +448,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://clouddebugger.googleapis.com/",
   "schemas": {
     "AliasContext": {
diff --git a/googleapiclient/discovery_cache/documents/cloudfunctions.v1.json b/googleapiclient/discovery_cache/documents/cloudfunctions.v1.json
index e484b33..87d0095 100644
--- a/googleapiclient/discovery_cache/documents/cloudfunctions.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudfunctions.v1.json
@@ -546,7 +546,7 @@
       }
     }
   },
-  "revision": "20210708",
+  "revision": "20210715",
   "rootUrl": "https://cloudfunctions.googleapis.com/",
   "schemas": {
     "AuditConfig": {
@@ -650,7 +650,7 @@
       "type": "object"
     },
     "CloudFunction": {
-      "description": "Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations.",
+      "description": "Describes a Cloud Function that contains user computation executed in response to an event. It encapsulate function and triggers configurations. Next tag: 35",
       "id": "CloudFunction",
       "properties": {
         "availableMemoryMb": {
@@ -1186,7 +1186,7 @@
           "type": "string"
         },
         "projectId": {
-          "description": "Project whose secret manager data is being referenced. Cross project secrets are not supported.",
+          "description": "Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function's project assuming that the secret exists in the same project as of the function.",
           "type": "string"
         },
         "secret": {
@@ -1224,7 +1224,7 @@
           "type": "string"
         },
         "projectId": {
-          "description": "Project whose secret manager data is being referenced. Cross project secrets are not supported.",
+          "description": "Project identifier (preferrably project number but can also be the project ID) of the project that contains the secret. If not set, it will be populated with the function's project assuming that the secret exists in the same project as of the function.",
           "type": "string"
         },
         "secret": {
diff --git a/googleapiclient/discovery_cache/documents/cloudidentity.v1.json b/googleapiclient/discovery_cache/documents/cloudidentity.v1.json
index cb53f24..60ddf81 100644
--- a/googleapiclient/discovery_cache/documents/cloudidentity.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudidentity.v1.json
@@ -1273,7 +1273,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://cloudidentity.googleapis.com/",
   "schemas": {
     "CheckTransitiveMembershipResponse": {
diff --git a/googleapiclient/discovery_cache/documents/cloudidentity.v1beta1.json b/googleapiclient/discovery_cache/documents/cloudidentity.v1beta1.json
index 5a0f7b5..9bc59db 100644
--- a/googleapiclient/discovery_cache/documents/cloudidentity.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudidentity.v1beta1.json
@@ -1336,7 +1336,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://cloudidentity.googleapis.com/",
   "schemas": {
     "AndroidAttributes": {
diff --git a/googleapiclient/discovery_cache/documents/cloudiot.v1.json b/googleapiclient/discovery_cache/documents/cloudiot.v1.json
index 9e4532d..e6155ec 100644
--- a/googleapiclient/discovery_cache/documents/cloudiot.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudiot.v1.json
@@ -938,7 +938,7 @@
       }
     }
   },
-  "revision": "20210706",
+  "revision": "20210713",
   "rootUrl": "https://cloudiot.googleapis.com/",
   "schemas": {
     "BindDeviceToGatewayRequest": {
diff --git a/googleapiclient/discovery_cache/documents/cloudprofiler.v2.json b/googleapiclient/discovery_cache/documents/cloudprofiler.v2.json
index c08ea8f..a717af2 100644
--- a/googleapiclient/discovery_cache/documents/cloudprofiler.v2.json
+++ b/googleapiclient/discovery_cache/documents/cloudprofiler.v2.json
@@ -216,7 +216,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210717",
   "rootUrl": "https://cloudprofiler.googleapis.com/",
   "schemas": {
     "CreateProfileRequest": {
diff --git a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v1.json b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v1.json
index 73d061e..9b1bd34 100644
--- a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v1.json
@@ -1171,7 +1171,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210718",
   "rootUrl": "https://cloudresourcemanager.googleapis.com/",
   "schemas": {
     "Ancestor": {
diff --git a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v1beta1.json b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v1beta1.json
index 040d73c..75c6bf1 100644
--- a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v1beta1.json
@@ -566,7 +566,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210718",
   "rootUrl": "https://cloudresourcemanager.googleapis.com/",
   "schemas": {
     "Ancestor": {
diff --git a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v2.json b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v2.json
index 1adfb46..9a6345a 100644
--- a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v2.json
+++ b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v2.json
@@ -450,7 +450,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210718",
   "rootUrl": "https://cloudresourcemanager.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v2beta1.json b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v2beta1.json
index 60fd0a7..a120f79 100644
--- a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v2beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v2beta1.json
@@ -450,7 +450,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210718",
   "rootUrl": "https://cloudresourcemanager.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v3.json b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v3.json
index 329c9f3..8714f98 100644
--- a/googleapiclient/discovery_cache/documents/cloudresourcemanager.v3.json
+++ b/googleapiclient/discovery_cache/documents/cloudresourcemanager.v3.json
@@ -1612,7 +1612,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210718",
   "rootUrl": "https://cloudresourcemanager.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/cloudscheduler.v1.json b/googleapiclient/discovery_cache/documents/cloudscheduler.v1.json
index ec7a6ea..9c7cf6d 100644
--- a/googleapiclient/discovery_cache/documents/cloudscheduler.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudscheduler.v1.json
@@ -418,7 +418,7 @@
       }
     }
   },
-  "revision": "20210625",
+  "revision": "20210713",
   "rootUrl": "https://cloudscheduler.googleapis.com/",
   "schemas": {
     "AppEngineHttpTarget": {
diff --git a/googleapiclient/discovery_cache/documents/cloudscheduler.v1beta1.json b/googleapiclient/discovery_cache/documents/cloudscheduler.v1beta1.json
index 676bebc..5f4b884 100644
--- a/googleapiclient/discovery_cache/documents/cloudscheduler.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudscheduler.v1beta1.json
@@ -428,7 +428,7 @@
       }
     }
   },
-  "revision": "20210625",
+  "revision": "20210713",
   "rootUrl": "https://cloudscheduler.googleapis.com/",
   "schemas": {
     "AppEngineHttpTarget": {
diff --git a/googleapiclient/discovery_cache/documents/cloudsearch.v1.json b/googleapiclient/discovery_cache/documents/cloudsearch.v1.json
index 1a80489..011701d 100644
--- a/googleapiclient/discovery_cache/documents/cloudsearch.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudsearch.v1.json
@@ -1916,7 +1916,7 @@
       }
     }
   },
-  "revision": "20210706",
+  "revision": "20210713",
   "rootUrl": "https://cloudsearch.googleapis.com/",
   "schemas": {
     "AuditLoggingSettings": {
diff --git a/googleapiclient/discovery_cache/documents/cloudtasks.v2.json b/googleapiclient/discovery_cache/documents/cloudtasks.v2.json
index c01ab21..ad7ca00 100644
--- a/googleapiclient/discovery_cache/documents/cloudtasks.v2.json
+++ b/googleapiclient/discovery_cache/documents/cloudtasks.v2.json
@@ -685,7 +685,7 @@
       }
     }
   },
-  "revision": "20210624",
+  "revision": "20210713",
   "rootUrl": "https://cloudtasks.googleapis.com/",
   "schemas": {
     "AppEngineHttpRequest": {
diff --git a/googleapiclient/discovery_cache/documents/cloudtasks.v2beta2.json b/googleapiclient/discovery_cache/documents/cloudtasks.v2beta2.json
index 66b6a9e..63a55c3 100644
--- a/googleapiclient/discovery_cache/documents/cloudtasks.v2beta2.json
+++ b/googleapiclient/discovery_cache/documents/cloudtasks.v2beta2.json
@@ -809,7 +809,7 @@
       }
     }
   },
-  "revision": "20210624",
+  "revision": "20210713",
   "rootUrl": "https://cloudtasks.googleapis.com/",
   "schemas": {
     "AcknowledgeTaskRequest": {
diff --git a/googleapiclient/discovery_cache/documents/cloudtasks.v2beta3.json b/googleapiclient/discovery_cache/documents/cloudtasks.v2beta3.json
index 9e54c4f..77697b2 100644
--- a/googleapiclient/discovery_cache/documents/cloudtasks.v2beta3.json
+++ b/googleapiclient/discovery_cache/documents/cloudtasks.v2beta3.json
@@ -697,7 +697,7 @@
       }
     }
   },
-  "revision": "20210624",
+  "revision": "20210713",
   "rootUrl": "https://cloudtasks.googleapis.com/",
   "schemas": {
     "AppEngineHttpQueue": {
diff --git a/googleapiclient/discovery_cache/documents/cloudtrace.v1.json b/googleapiclient/discovery_cache/documents/cloudtrace.v1.json
index 2159f3e..4b5ae1b 100644
--- a/googleapiclient/discovery_cache/documents/cloudtrace.v1.json
+++ b/googleapiclient/discovery_cache/documents/cloudtrace.v1.json
@@ -257,7 +257,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210719",
   "rootUrl": "https://cloudtrace.googleapis.com/",
   "schemas": {
     "Empty": {
diff --git a/googleapiclient/discovery_cache/documents/cloudtrace.v2.json b/googleapiclient/discovery_cache/documents/cloudtrace.v2.json
index 4c80852..884fc9f 100644
--- a/googleapiclient/discovery_cache/documents/cloudtrace.v2.json
+++ b/googleapiclient/discovery_cache/documents/cloudtrace.v2.json
@@ -181,7 +181,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210719",
   "rootUrl": "https://cloudtrace.googleapis.com/",
   "schemas": {
     "Annotation": {
diff --git a/googleapiclient/discovery_cache/documents/cloudtrace.v2beta1.json b/googleapiclient/discovery_cache/documents/cloudtrace.v2beta1.json
index 3f17efd..bff08d1 100644
--- a/googleapiclient/discovery_cache/documents/cloudtrace.v2beta1.json
+++ b/googleapiclient/discovery_cache/documents/cloudtrace.v2beta1.json
@@ -273,7 +273,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210719",
   "rootUrl": "https://cloudtrace.googleapis.com/",
   "schemas": {
     "Empty": {
diff --git a/googleapiclient/discovery_cache/documents/composer.v1.json b/googleapiclient/discovery_cache/documents/composer.v1.json
index 4bf9800..464d715 100644
--- a/googleapiclient/discovery_cache/documents/composer.v1.json
+++ b/googleapiclient/discovery_cache/documents/composer.v1.json
@@ -406,7 +406,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210721",
   "rootUrl": "https://composer.googleapis.com/",
   "schemas": {
     "AllowedIpRange": {
diff --git a/googleapiclient/discovery_cache/documents/composer.v1beta1.json b/googleapiclient/discovery_cache/documents/composer.v1beta1.json
index d5f2fb1..fbe0609 100644
--- a/googleapiclient/discovery_cache/documents/composer.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/composer.v1beta1.json
@@ -462,7 +462,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210721",
   "rootUrl": "https://composer.googleapis.com/",
   "schemas": {
     "AllowedIpRange": {
diff --git a/googleapiclient/discovery_cache/documents/container.v1.json b/googleapiclient/discovery_cache/documents/container.v1.json
index 104da6f..9bfed38 100644
--- a/googleapiclient/discovery_cache/documents/container.v1.json
+++ b/googleapiclient/discovery_cache/documents/container.v1.json
@@ -2459,7 +2459,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210708",
   "rootUrl": "https://container.googleapis.com/",
   "schemas": {
     "AcceleratorConfig": {
@@ -4147,7 +4147,7 @@
           "type": "boolean"
         },
         "maxNodeCount": {
-          "description": "Maximum number of nodes in the NodePool. Must be >= min_node_count. There has to enough quota to scale up the cluster.",
+          "description": "Maximum number of nodes in the NodePool. Must be >= min_node_count. There has to be enough quota to scale up the cluster.",
           "format": "int32",
           "type": "integer"
         },
diff --git a/googleapiclient/discovery_cache/documents/container.v1beta1.json b/googleapiclient/discovery_cache/documents/container.v1beta1.json
index 578850d..92cc60f 100644
--- a/googleapiclient/discovery_cache/documents/container.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/container.v1beta1.json
@@ -2484,7 +2484,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210708",
   "rootUrl": "https://container.googleapis.com/",
   "schemas": {
     "AcceleratorConfig": {
@@ -4528,7 +4528,7 @@
           "type": "boolean"
         },
         "maxNodeCount": {
-          "description": "Maximum number of nodes in the NodePool. Must be >= min_node_count. There has to enough quota to scale up the cluster.",
+          "description": "Maximum number of nodes in the NodePool. Must be >= min_node_count. There has to be enough quota to scale up the cluster.",
           "format": "int32",
           "type": "integer"
         },
diff --git a/googleapiclient/discovery_cache/documents/containeranalysis.v1alpha1.json b/googleapiclient/discovery_cache/documents/containeranalysis.v1alpha1.json
index 6795ac8..f4e76e0 100644
--- a/googleapiclient/discovery_cache/documents/containeranalysis.v1alpha1.json
+++ b/googleapiclient/discovery_cache/documents/containeranalysis.v1alpha1.json
@@ -1219,7 +1219,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210714",
   "rootUrl": "https://containeranalysis.googleapis.com/",
   "schemas": {
     "Artifact": {
diff --git a/googleapiclient/discovery_cache/documents/containeranalysis.v1beta1.json b/googleapiclient/discovery_cache/documents/containeranalysis.v1beta1.json
index 7cd890b..026b342 100644
--- a/googleapiclient/discovery_cache/documents/containeranalysis.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/containeranalysis.v1beta1.json
@@ -853,7 +853,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210714",
   "rootUrl": "https://containeranalysis.googleapis.com/",
   "schemas": {
     "AliasContext": {
diff --git a/googleapiclient/discovery_cache/documents/content.v2.1.json b/googleapiclient/discovery_cache/documents/content.v2.1.json
index 9fd3b26..114451f 100644
--- a/googleapiclient/discovery_cache/documents/content.v2.1.json
+++ b/googleapiclient/discovery_cache/documents/content.v2.1.json
@@ -428,6 +428,42 @@
             "https://www.googleapis.com/auth/content"
           ]
         },
+        "requestphoneverification": {
+          "description": "Request verification code to start phone verification.",
+          "flatPath": "{merchantId}/accounts/{accountId}/requestphoneverification",
+          "httpMethod": "POST",
+          "id": "content.accounts.requestphoneverification",
+          "parameterOrder": [
+            "merchantId",
+            "accountId"
+          ],
+          "parameters": {
+            "accountId": {
+              "description": "Required. The ID of the account.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "merchantId": {
+              "description": "Required. The ID of the managing account. If this parameter is not the same as accountId, then this account must be a multi-client account and accountId must be the ID of a sub-account of this account.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{merchantId}/accounts/{accountId}/requestphoneverification",
+          "request": {
+            "$ref": "RequestPhoneVerificationRequest"
+          },
+          "response": {
+            "$ref": "RequestPhoneVerificationResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/content"
+          ]
+        },
         "update": {
           "description": "Updates a Merchant Center account. Any fields that are not provided are deleted from the resource.",
           "flatPath": "{merchantId}/accounts/{accountId}",
@@ -499,6 +535,42 @@
           "scopes": [
             "https://www.googleapis.com/auth/content"
           ]
+        },
+        "verifyphonenumber": {
+          "description": "Validates verification code to verify phone number for the account.",
+          "flatPath": "{merchantId}/accounts/{accountId}/verifyphonenumber",
+          "httpMethod": "POST",
+          "id": "content.accounts.verifyphonenumber",
+          "parameterOrder": [
+            "merchantId",
+            "accountId"
+          ],
+          "parameters": {
+            "accountId": {
+              "description": "Required. The ID of the account.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "merchantId": {
+              "description": "Required. The ID of the managing account. If this parameter is not the same as accountId, then this account must be a multi-client account and accountId must be the ID of a sub-account of this account.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{merchantId}/accounts/{accountId}/verifyphonenumber",
+          "request": {
+            "$ref": "VerifyPhoneNumberRequest"
+          },
+          "response": {
+            "$ref": "VerifyPhoneNumberResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/content"
+          ]
         }
       },
       "resources": {
@@ -1821,6 +1893,60 @@
         }
       }
     },
+    "freelistingsprogram": {
+      "methods": {
+        "get": {
+          "description": "Retrieves the status and review eligibility for the free listing program.",
+          "flatPath": "{merchantId}/freelistingsprogram",
+          "httpMethod": "GET",
+          "id": "content.freelistingsprogram.get",
+          "parameterOrder": [
+            "merchantId"
+          ],
+          "parameters": {
+            "merchantId": {
+              "description": "Required. The ID of the account.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{merchantId}/freelistingsprogram",
+          "response": {
+            "$ref": "FreeListingsProgramStatus"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/content"
+          ]
+        },
+        "requestreview": {
+          "description": "Requests a review for Free Listings program in the provided region. Important: This method is only whitelisted for selected merchants.",
+          "flatPath": "{merchantId}/freelistingsprogram/requestreview",
+          "httpMethod": "POST",
+          "id": "content.freelistingsprogram.requestreview",
+          "parameterOrder": [
+            "merchantId"
+          ],
+          "parameters": {
+            "merchantId": {
+              "description": "Required. The ID of the account.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{merchantId}/freelistingsprogram/requestreview",
+          "request": {
+            "$ref": "RequestReviewFreeListingsRequest"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/content"
+          ]
+        }
+      }
+    },
     "liasettings": {
       "methods": {
         "custombatch": {
@@ -5493,9 +5619,63 @@
           ]
         }
       }
+    },
+    "shoppingadsprogram": {
+      "methods": {
+        "get": {
+          "description": "Retrieves the status and review eligibility for the Shopping Ads program.",
+          "flatPath": "{merchantId}/shoppingadsprogram",
+          "httpMethod": "GET",
+          "id": "content.shoppingadsprogram.get",
+          "parameterOrder": [
+            "merchantId"
+          ],
+          "parameters": {
+            "merchantId": {
+              "description": "Required. The ID of the account.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{merchantId}/shoppingadsprogram",
+          "response": {
+            "$ref": "ShoppingAdsProgramStatus"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/content"
+          ]
+        },
+        "requestreview": {
+          "description": "Requests a review for Shopping Ads program in the provided country.",
+          "flatPath": "{merchantId}/shoppingadsprogram/requestreview",
+          "httpMethod": "POST",
+          "id": "content.shoppingadsprogram.requestreview",
+          "parameterOrder": [
+            "merchantId"
+          ],
+          "parameters": {
+            "merchantId": {
+              "description": "Required. The ID of the account.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "{merchantId}/shoppingadsprogram/requestreview",
+          "request": {
+            "$ref": "RequestReviewShoppingAdsRequest"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/content"
+          ]
+        }
+      }
     }
   },
-  "revision": "20210715",
+  "revision": "20210722",
   "rootUrl": "https://shoppingcontent.googleapis.com/",
   "schemas": {
     "Account": {
@@ -7559,6 +7739,121 @@
       },
       "type": "object"
     },
+    "FreeListingsProgramStatus": {
+      "description": "Response message for GetFreeListingsProgramStatus.",
+      "id": "FreeListingsProgramStatus",
+      "properties": {
+        "regionStatuses": {
+          "description": "Status of the program in each region. Regions with the same status and review eligibility are grouped together in `regionCodes`.",
+          "items": {
+            "$ref": "FreeListingsProgramStatusRegionStatus"
+          },
+          "type": "array"
+        },
+        "state": {
+          "description": "If program is successfully onboarded for at least one region.",
+          "enum": [
+            "PROGRAM_STATE_UNSPECIFIED",
+            "ONBOARDED",
+            "NOT_ONBOARDED"
+          ],
+          "enumDescriptions": [
+            "State is not known.",
+            "Program is onboarded for at least one country.",
+            "Program is not onboarded for any country."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "FreeListingsProgramStatusRegionStatus": {
+      "description": "Status of program and region.",
+      "id": "FreeListingsProgramStatusRegionStatus",
+      "properties": {
+        "disapprovalDate": {
+          "description": "Date by which `eligibility_status` will go from `WARNING` to `DISAPPROVED`. It will be present when `eligibility_status` is `WARNING`. Date will be provided in ISO 8601 format i.e. YYYY-MM-DD",
+          "type": "string"
+        },
+        "eligibilityStatus": {
+          "description": "Eligibility status of the standard free listing program.",
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "APPROVED",
+            "DISAPPROVED",
+            "WARNING",
+            "UNDER_REVIEW",
+            "PENDING_REVIEW",
+            "ONBOARDING"
+          ],
+          "enumDescriptions": [
+            "State is not known.",
+            "If the account has no issues and review is completed successfully.",
+            "There are one or more issues that needs to be resolved for account to be active for the program. Detailed list of account issues are available in [accountstatuses](https://developers.google.com/shopping-content/reference/rest/v2.1/accountstatuses) API.",
+            "If account has issues but offers are servable. Some of the issue can make account DISAPPROVED after a certain deadline.",
+            "Account is under review.",
+            "Account is waiting for review to start.",
+            "Program is currently onboarding."
+          ],
+          "type": "string"
+        },
+        "enhancedEligibilityStatus": {
+          "description": "Eligibility status of the enhanced free listing program.",
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "APPROVED",
+            "DISAPPROVED",
+            "WARNING",
+            "UNDER_REVIEW",
+            "PENDING_REVIEW",
+            "ONBOARDING"
+          ],
+          "enumDescriptions": [
+            "State is not known.",
+            "If the account has no issues and review is completed successfully.",
+            "There are one or more issues that needs to be resolved for account to be active for the program. Detailed list of account issues are available in [accountstatuses](https://developers.google.com/shopping-content/reference/rest/v2.1/accountstatuses) API.",
+            "If account has issues but offers are servable. Some of the issue can make account DISAPPROVED after a certain deadline.",
+            "Account is under review.",
+            "Account is waiting for review to start.",
+            "Program is currently onboarding."
+          ],
+          "type": "string"
+        },
+        "ineligibilityReason": {
+          "description": "Reason if a program in a given country is not eligible for review. Populated only if `review_eligibility_status` is `INELIGIBLE`.",
+          "type": "string"
+        },
+        "regionCodes": {
+          "description": "The two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) codes for all the regions with the same `eligibilityStatus` and `reviewEligibility`.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "reviewEligibilityStatus": {
+          "description": "If a program in a given country is eligible for review. It will be present only if eligibility status is `DISAPPROVED`.",
+          "enum": [
+            "REVIEW_ELIGIBILITY_UNSPECIFIED",
+            "ELIGIBLE",
+            "INELIGIBLE"
+          ],
+          "enumDescriptions": [
+            "Review eligibility state is unknown.",
+            "Account for a region code is eligible for review.",
+            "Account for a region code is not eligible for review."
+          ],
+          "type": "string"
+        },
+        "reviewIssues": {
+          "description": "These issues will be evaluated in review process. Fix all the issues before requesting the review.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GmbAccounts": {
       "id": "GmbAccounts",
       "properties": {
@@ -13134,12 +13429,78 @@
       },
       "type": "object"
     },
+    "RequestPhoneVerificationRequest": {
+      "description": "Request message for the RequestPhoneVerification method.",
+      "id": "RequestPhoneVerificationRequest",
+      "properties": {
+        "languageCode": {
+          "description": "Language code [IETF BCP 47 syntax](https://tools.ietf.org/html/bcp47) (for example, en-US). Language code is used to provide localized `SMS` and `PHONE_CALL`. Default language used is en-US if not provided.",
+          "type": "string"
+        },
+        "phoneNumber": {
+          "description": "Phone number to be verified.",
+          "type": "string"
+        },
+        "phoneRegionCode": {
+          "description": "Required. Two letter country code for the phone number, for example `CA` for Canadian numbers. See the [ISO 3166-1 alpha-2](https://wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements) officially assigned codes.",
+          "type": "string"
+        },
+        "phoneVerificationMethod": {
+          "description": "Verification method to receive verification code.",
+          "enum": [
+            "PHONE_VERIFICATION_METHOD_UNSPECIFIED",
+            "SMS",
+            "PHONE_CALL"
+          ],
+          "enumDescriptions": [
+            "Unknown method.",
+            "Receive verification code by SMS.",
+            "Receive verification code by phone call."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "RequestPhoneVerificationResponse": {
+      "description": "Response message for the RequestPhoneVerification method.",
+      "id": "RequestPhoneVerificationResponse",
+      "properties": {
+        "verificationId": {
+          "description": "The verification ID to use in subsequent calls to `verifyphonenumber`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "RequestReviewBuyOnGoogleProgramRequest": {
       "description": "Request message for the RequestReviewProgram method.",
       "id": "RequestReviewBuyOnGoogleProgramRequest",
       "properties": {},
       "type": "object"
     },
+    "RequestReviewFreeListingsRequest": {
+      "description": "Request message for the RequestReviewFreeListings Program method.",
+      "id": "RequestReviewFreeListingsRequest",
+      "properties": {
+        "regionCode": {
+          "description": "The code [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the country for which review is to be requested.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "RequestReviewShoppingAdsRequest": {
+      "description": "Request message for the RequestReviewShoppingAds program method.",
+      "id": "RequestReviewShoppingAdsRequest",
+      "properties": {
+        "regionCode": {
+          "description": "The code [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) of the country for which review is to be requested.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "ReturnAddress": {
       "description": "Return address resource.",
       "id": "ReturnAddress",
@@ -13793,7 +14154,7 @@
           "type": "string"
         },
         "query": {
-          "description": "Required. Query that defines performance metrics to retrieve and dimensions according to which the metrics are to be segmented.",
+          "description": "Required. Query that defines performance metrics to retrieve and dimensions according to which the metrics are to be segmented. For details on how to construct your query, see the [Query Language guide](https://developers.google.com/shopping-content/guides/reports/query-language/overview).",
           "type": "string"
         }
       },
@@ -13826,23 +14187,23 @@
           "type": "string"
         },
         "categoryL1": {
-          "description": "Product category (1st level) in Google's product taxonomy.",
+          "description": "[Product category (1st level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google's product taxonomy.",
           "type": "string"
         },
         "categoryL2": {
-          "description": "Product category (2nd level) in Google's product taxonomy.",
+          "description": "[Product category (2nd level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google's product taxonomy.",
           "type": "string"
         },
         "categoryL3": {
-          "description": "Product category (3rd level) in Google's product taxonomy.",
+          "description": "[Product category (3rd level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google's product taxonomy.",
           "type": "string"
         },
         "categoryL4": {
-          "description": "Product category (4th level) in Google's product taxonomy.",
+          "description": "[Product category (4th level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google's product taxonomy.",
           "type": "string"
         },
         "categoryL5": {
-          "description": "Product category (5th level) in Google's product taxonomy.",
+          "description": "[Product category (5th level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in Google's product taxonomy.",
           "type": "string"
         },
         "currencyCode": {
@@ -13878,23 +14239,23 @@
           "type": "string"
         },
         "productTypeL1": {
-          "description": "Product category (1st level) in merchant's own product taxonomy.",
+          "description": "[Product type (1st level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant's own product taxonomy.",
           "type": "string"
         },
         "productTypeL2": {
-          "description": "Product category (2nd level) in merchant's own product taxonomy.",
+          "description": "[Product type (2nd level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant's own product taxonomy.",
           "type": "string"
         },
         "productTypeL3": {
-          "description": "Product category (3rd level) in merchant's own product taxonomy.",
+          "description": "[Product type (3rd level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant's own product taxonomy.",
           "type": "string"
         },
         "productTypeL4": {
-          "description": "Product category (4th level) in merchant's own product taxonomy.",
+          "description": "[Product type (4th level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant's own product taxonomy.",
           "type": "string"
         },
         "productTypeL5": {
-          "description": "Product category (5th level) in merchant's own product taxonomy.",
+          "description": "[Product type (5th level)](https://developers.google.com/shopping-content/guides/reports/segmentation#category_and_product_type) in merchant's own product taxonomy.",
           "type": "string"
         },
         "program": {
@@ -14407,6 +14768,99 @@
       },
       "type": "object"
     },
+    "ShoppingAdsProgramStatus": {
+      "description": "Response message for GetShoppingAdsProgramStatus.",
+      "id": "ShoppingAdsProgramStatus",
+      "properties": {
+        "regionStatuses": {
+          "description": "Status of the program in each region. Regions with the same status and review eligibility are grouped together in `regionCodes`.",
+          "items": {
+            "$ref": "ShoppingAdsProgramStatusRegionStatus"
+          },
+          "type": "array"
+        },
+        "state": {
+          "description": "If program is successfully onboarded for at least one region.",
+          "enum": [
+            "PROGRAM_STATE_UNSPECIFIED",
+            "ONBOARDED",
+            "NOT_ONBOARDED"
+          ],
+          "enumDescriptions": [
+            "State is not known.",
+            "Program is onboarded for at least one country.",
+            "Program is not onboarded for any country."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "ShoppingAdsProgramStatusRegionStatus": {
+      "description": "Status of program and region.",
+      "id": "ShoppingAdsProgramStatusRegionStatus",
+      "properties": {
+        "disapprovalDate": {
+          "description": "Date by which `eligibility_status` will go from `WARNING` to `DISAPPROVED`. It will be present when `eligibility_status` is `WARNING`. Date will be provided in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format i.e. YYYY-MM-DD",
+          "type": "string"
+        },
+        "eligibilityStatus": {
+          "description": "Eligibility status of the Shopping Ads program.",
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "APPROVED",
+            "DISAPPROVED",
+            "WARNING",
+            "UNDER_REVIEW",
+            "PENDING_REVIEW",
+            "ONBOARDING"
+          ],
+          "enumDescriptions": [
+            "State is not known.",
+            "If the account has no issues and review is completed successfully.",
+            "There are one or more issues that needs to be resolved for account to be active for the program. Detailed list of account issues are available in [accountstatuses](https://developers.google.com/shopping-content/reference/rest/v2.1/accountstatuses) API.",
+            "If account has issues but offers are servable. Some of the issue can make account DISAPPROVED after a certain deadline.",
+            "Account is under review.",
+            "Account is waiting for review to start.",
+            "Program is currently onboarding."
+          ],
+          "type": "string"
+        },
+        "ineligibilityReason": {
+          "description": "Reason if a program in a given country is not eligible for review. Populated only if `review_eligibility_status` is `INELIGIBLE`.",
+          "type": "string"
+        },
+        "regionCodes": {
+          "description": "The two-letter [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) codes for all the regions with the same `eligibilityStatus` and `reviewEligibility`.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "reviewEligibilityStatus": {
+          "description": "If a program in a given country is eligible for review. It will be present only if eligibility status is `DISAPPROVED`.",
+          "enum": [
+            "REVIEW_ELIGIBILITY_UNSPECIFIED",
+            "ELIGIBLE",
+            "INELIGIBLE"
+          ],
+          "enumDescriptions": [
+            "Review eligibility state is unknown.",
+            "Account for a region code is eligible for review.",
+            "Account for a region code is not eligible for review."
+          ],
+          "type": "string"
+        },
+        "reviewIssues": {
+          "description": "These issues will be evaluated in review process. Fix all the issues before requesting the review.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "Table": {
       "id": "Table",
       "properties": {
@@ -14836,6 +15290,46 @@
       },
       "type": "object"
     },
+    "VerifyPhoneNumberRequest": {
+      "description": "Request message for the VerifyPhoneNumber method.",
+      "id": "VerifyPhoneNumberRequest",
+      "properties": {
+        "phoneVerificationMethod": {
+          "description": "Verification method used to receive verification code.",
+          "enum": [
+            "PHONE_VERIFICATION_METHOD_UNSPECIFIED",
+            "SMS",
+            "PHONE_CALL"
+          ],
+          "enumDescriptions": [
+            "Unknown method.",
+            "Receive verification code by SMS.",
+            "Receive verification code by phone call."
+          ],
+          "type": "string"
+        },
+        "verificationCode": {
+          "description": "The verification code that was sent to the phone number for validation.",
+          "type": "string"
+        },
+        "verificationId": {
+          "description": "The verification ID returned by `requestphoneverification`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "VerifyPhoneNumberResponse": {
+      "description": "Response message for the VerifyPhoneNumber method.",
+      "id": "VerifyPhoneNumberResponse",
+      "properties": {
+        "verifiedPhoneNumber": {
+          "description": "Verified phone number if verification is successful.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "WarehouseBasedDeliveryTime": {
       "id": "WarehouseBasedDeliveryTime",
       "properties": {
diff --git a/googleapiclient/discovery_cache/documents/content.v2.json b/googleapiclient/discovery_cache/documents/content.v2.json
index 53b31b8..bbd5fde 100644
--- a/googleapiclient/discovery_cache/documents/content.v2.json
+++ b/googleapiclient/discovery_cache/documents/content.v2.json
@@ -3298,7 +3298,7 @@
       }
     }
   },
-  "revision": "20210715",
+  "revision": "20210722",
   "rootUrl": "https://shoppingcontent.googleapis.com/",
   "schemas": {
     "Account": {
diff --git a/googleapiclient/discovery_cache/documents/customsearch.v1.json b/googleapiclient/discovery_cache/documents/customsearch.v1.json
index 8f8dd04..f5dafa7 100644
--- a/googleapiclient/discovery_cache/documents/customsearch.v1.json
+++ b/googleapiclient/discovery_cache/documents/customsearch.v1.json
@@ -674,7 +674,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://customsearch.googleapis.com/",
   "schemas": {
     "Promotion": {
diff --git a/googleapiclient/discovery_cache/documents/dataflow.v1b3.json b/googleapiclient/discovery_cache/documents/dataflow.v1b3.json
index 5fbc81d..98478bc 100644
--- a/googleapiclient/discovery_cache/documents/dataflow.v1b3.json
+++ b/googleapiclient/discovery_cache/documents/dataflow.v1b3.json
@@ -2225,7 +2225,7 @@
       }
     }
   },
-  "revision": "20210703",
+  "revision": "20210720",
   "rootUrl": "https://dataflow.googleapis.com/",
   "schemas": {
     "ApproximateProgress": {
diff --git a/googleapiclient/discovery_cache/documents/datalabeling.v1beta1.json b/googleapiclient/discovery_cache/documents/datalabeling.v1beta1.json
index 2837c64..2d0d40b 100644
--- a/googleapiclient/discovery_cache/documents/datalabeling.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/datalabeling.v1beta1.json
@@ -1596,7 +1596,7 @@
       }
     }
   },
-  "revision": "20210706",
+  "revision": "20210719",
   "rootUrl": "https://datalabeling.googleapis.com/",
   "schemas": {
     "GoogleCloudDatalabelingV1alpha1CreateInstructionMetadata": {
diff --git a/googleapiclient/discovery_cache/documents/datamigration.v1.json b/googleapiclient/discovery_cache/documents/datamigration.v1.json
index 466e8ab..edd1645 100644
--- a/googleapiclient/discovery_cache/documents/datamigration.v1.json
+++ b/googleapiclient/discovery_cache/documents/datamigration.v1.json
@@ -1049,7 +1049,7 @@
       }
     }
   },
-  "revision": "20210630",
+  "revision": "20210717",
   "rootUrl": "https://datamigration.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/datamigration.v1beta1.json b/googleapiclient/discovery_cache/documents/datamigration.v1beta1.json
index 0acc8f3..084ab87 100644
--- a/googleapiclient/discovery_cache/documents/datamigration.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/datamigration.v1beta1.json
@@ -1049,7 +1049,7 @@
       }
     }
   },
-  "revision": "20210630",
+  "revision": "20210717",
   "rootUrl": "https://datamigration.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/dataproc.v1.json b/googleapiclient/discovery_cache/documents/dataproc.v1.json
index 62f0353..d8e0c85 100644
--- a/googleapiclient/discovery_cache/documents/dataproc.v1.json
+++ b/googleapiclient/discovery_cache/documents/dataproc.v1.json
@@ -2301,7 +2301,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210715",
   "rootUrl": "https://dataproc.googleapis.com/",
   "schemas": {
     "AcceleratorConfig": {
diff --git a/googleapiclient/discovery_cache/documents/dataproc.v1beta2.json b/googleapiclient/discovery_cache/documents/dataproc.v1beta2.json
index 1ecf568..4460101 100644
--- a/googleapiclient/discovery_cache/documents/dataproc.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/dataproc.v1beta2.json
@@ -2291,7 +2291,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210715",
   "rootUrl": "https://dataproc.googleapis.com/",
   "schemas": {
     "AcceleratorConfig": {
diff --git a/googleapiclient/discovery_cache/documents/deploymentmanager.alpha.json b/googleapiclient/discovery_cache/documents/deploymentmanager.alpha.json
index 3277cf9..002ff92 100644
--- a/googleapiclient/discovery_cache/documents/deploymentmanager.alpha.json
+++ b/googleapiclient/discovery_cache/documents/deploymentmanager.alpha.json
@@ -1588,7 +1588,7 @@
       }
     }
   },
-  "revision": "20210624",
+  "revision": "20210715",
   "rootUrl": "https://deploymentmanager.googleapis.com/",
   "schemas": {
     "AsyncOptions": {
diff --git a/googleapiclient/discovery_cache/documents/deploymentmanager.v2.json b/googleapiclient/discovery_cache/documents/deploymentmanager.v2.json
index 587be42..c6fd561 100644
--- a/googleapiclient/discovery_cache/documents/deploymentmanager.v2.json
+++ b/googleapiclient/discovery_cache/documents/deploymentmanager.v2.json
@@ -988,7 +988,7 @@
       }
     }
   },
-  "revision": "20210624",
+  "revision": "20210715",
   "rootUrl": "https://deploymentmanager.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/deploymentmanager.v2beta.json b/googleapiclient/discovery_cache/documents/deploymentmanager.v2beta.json
index 7856ca0..dd53e9e 100644
--- a/googleapiclient/discovery_cache/documents/deploymentmanager.v2beta.json
+++ b/googleapiclient/discovery_cache/documents/deploymentmanager.v2beta.json
@@ -1552,7 +1552,7 @@
       }
     }
   },
-  "revision": "20210624",
+  "revision": "20210715",
   "rootUrl": "https://deploymentmanager.googleapis.com/",
   "schemas": {
     "AsyncOptions": {
diff --git a/googleapiclient/discovery_cache/documents/digitalassetlinks.v1.json b/googleapiclient/discovery_cache/documents/digitalassetlinks.v1.json
index 6de9821..0357a3e 100644
--- a/googleapiclient/discovery_cache/documents/digitalassetlinks.v1.json
+++ b/googleapiclient/discovery_cache/documents/digitalassetlinks.v1.json
@@ -184,7 +184,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://digitalassetlinks.googleapis.com/",
   "schemas": {
     "AndroidAppAsset": {
diff --git a/googleapiclient/discovery_cache/documents/displayvideo.v1.json b/googleapiclient/discovery_cache/documents/displayvideo.v1.json
index 548c8cf..2a442c2 100644
--- a/googleapiclient/discovery_cache/documents/displayvideo.v1.json
+++ b/googleapiclient/discovery_cache/documents/displayvideo.v1.json
@@ -754,7 +754,10 @@
                             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                             "TARGETING_TYPE_EXCHANGE",
                             "TARGETING_TYPE_SUB_EXCHANGE",
-                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                            "TARGETING_TYPE_POI",
+                            "TARGETING_TYPE_BUSINESS_CHAIN",
+                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                            "TARGETING_TYPE_OMID"
                           ],
                           "enumDescriptions": [
                             "Default value when type is not specified or is unknown in this version.",
@@ -795,7 +798,10 @@
                             "Purchase impressions from a group of deals and auction packages.",
                             "Purchase impressions from specific exchanges.",
                             "Purchase impressions from specific sub-exchanges.",
-                            "Target ads to a specific native content position."
+                            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                            "Target ads around locations of a business chain within a specific geo region.",
+                            "Target ads to a specific native content position.",
+                            "Target ads in an Open Measurement enabled inventory."
                           ],
                           "location": "path",
                           "pattern": "^[^/]+$",
@@ -900,7 +906,10 @@
                             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                             "TARGETING_TYPE_EXCHANGE",
                             "TARGETING_TYPE_SUB_EXCHANGE",
-                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                            "TARGETING_TYPE_POI",
+                            "TARGETING_TYPE_BUSINESS_CHAIN",
+                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                            "TARGETING_TYPE_OMID"
                           ],
                           "enumDescriptions": [
                             "Default value when type is not specified or is unknown in this version.",
@@ -941,7 +950,10 @@
                             "Purchase impressions from a group of deals and auction packages.",
                             "Purchase impressions from specific exchanges.",
                             "Purchase impressions from specific sub-exchanges.",
-                            "Target ads to a specific native content position."
+                            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                            "Target ads around locations of a business chain within a specific geo region.",
+                            "Target ads to a specific native content position.",
+                            "Target ads in an Open Measurement enabled inventory."
                           ],
                           "location": "path",
                           "pattern": "^[^/]+$",
@@ -1902,7 +1914,10 @@
                             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                             "TARGETING_TYPE_EXCHANGE",
                             "TARGETING_TYPE_SUB_EXCHANGE",
-                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                            "TARGETING_TYPE_POI",
+                            "TARGETING_TYPE_BUSINESS_CHAIN",
+                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                            "TARGETING_TYPE_OMID"
                           ],
                           "enumDescriptions": [
                             "Default value when type is not specified or is unknown in this version.",
@@ -1943,7 +1958,10 @@
                             "Purchase impressions from a group of deals and auction packages.",
                             "Purchase impressions from specific exchanges.",
                             "Purchase impressions from specific sub-exchanges.",
-                            "Target ads to a specific native content position."
+                            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                            "Target ads around locations of a business chain within a specific geo region.",
+                            "Target ads to a specific native content position.",
+                            "Target ads in an Open Measurement enabled inventory."
                           ],
                           "location": "path",
                           "pattern": "^[^/]+$",
@@ -2048,7 +2066,10 @@
                             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                             "TARGETING_TYPE_EXCHANGE",
                             "TARGETING_TYPE_SUB_EXCHANGE",
-                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                            "TARGETING_TYPE_POI",
+                            "TARGETING_TYPE_BUSINESS_CHAIN",
+                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                            "TARGETING_TYPE_OMID"
                           ],
                           "enumDescriptions": [
                             "Default value when type is not specified or is unknown in this version.",
@@ -2089,7 +2110,10 @@
                             "Purchase impressions from a group of deals and auction packages.",
                             "Purchase impressions from specific exchanges.",
                             "Purchase impressions from specific sub-exchanges.",
-                            "Target ads to a specific native content position."
+                            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                            "Target ads around locations of a business chain within a specific geo region.",
+                            "Target ads to a specific native content position.",
+                            "Target ads in an Open Measurement enabled inventory."
                           ],
                           "location": "path",
                           "pattern": "^[^/]+$",
@@ -2594,7 +2618,10 @@
                             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                             "TARGETING_TYPE_EXCHANGE",
                             "TARGETING_TYPE_SUB_EXCHANGE",
-                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                            "TARGETING_TYPE_POI",
+                            "TARGETING_TYPE_BUSINESS_CHAIN",
+                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                            "TARGETING_TYPE_OMID"
                           ],
                           "enumDescriptions": [
                             "Default value when type is not specified or is unknown in this version.",
@@ -2635,7 +2662,10 @@
                             "Purchase impressions from a group of deals and auction packages.",
                             "Purchase impressions from specific exchanges.",
                             "Purchase impressions from specific sub-exchanges.",
-                            "Target ads to a specific native content position."
+                            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                            "Target ads around locations of a business chain within a specific geo region.",
+                            "Target ads to a specific native content position.",
+                            "Target ads in an Open Measurement enabled inventory."
                           ],
                           "location": "path",
                           "pattern": "^[^/]+$",
@@ -2730,7 +2760,10 @@
                             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                             "TARGETING_TYPE_EXCHANGE",
                             "TARGETING_TYPE_SUB_EXCHANGE",
-                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                            "TARGETING_TYPE_POI",
+                            "TARGETING_TYPE_BUSINESS_CHAIN",
+                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                            "TARGETING_TYPE_OMID"
                           ],
                           "enumDescriptions": [
                             "Default value when type is not specified or is unknown in this version.",
@@ -2771,7 +2804,10 @@
                             "Purchase impressions from a group of deals and auction packages.",
                             "Purchase impressions from specific exchanges.",
                             "Purchase impressions from specific sub-exchanges.",
-                            "Target ads to a specific native content position."
+                            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                            "Target ads around locations of a business chain within a specific geo region.",
+                            "Target ads to a specific native content position.",
+                            "Target ads in an Open Measurement enabled inventory."
                           ],
                           "location": "path",
                           "pattern": "^[^/]+$",
@@ -2863,7 +2899,10 @@
                             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                             "TARGETING_TYPE_EXCHANGE",
                             "TARGETING_TYPE_SUB_EXCHANGE",
-                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                            "TARGETING_TYPE_POI",
+                            "TARGETING_TYPE_BUSINESS_CHAIN",
+                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                            "TARGETING_TYPE_OMID"
                           ],
                           "enumDescriptions": [
                             "Default value when type is not specified or is unknown in this version.",
@@ -2904,7 +2943,10 @@
                             "Purchase impressions from a group of deals and auction packages.",
                             "Purchase impressions from specific exchanges.",
                             "Purchase impressions from specific sub-exchanges.",
-                            "Target ads to a specific native content position."
+                            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                            "Target ads around locations of a business chain within a specific geo region.",
+                            "Target ads to a specific native content position.",
+                            "Target ads in an Open Measurement enabled inventory."
                           ],
                           "location": "path",
                           "pattern": "^[^/]+$",
@@ -3009,7 +3051,10 @@
                             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                             "TARGETING_TYPE_EXCHANGE",
                             "TARGETING_TYPE_SUB_EXCHANGE",
-                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                            "TARGETING_TYPE_POI",
+                            "TARGETING_TYPE_BUSINESS_CHAIN",
+                            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                            "TARGETING_TYPE_OMID"
                           ],
                           "enumDescriptions": [
                             "Default value when type is not specified or is unknown in this version.",
@@ -3050,7 +3095,10 @@
                             "Purchase impressions from a group of deals and auction packages.",
                             "Purchase impressions from specific exchanges.",
                             "Purchase impressions from specific sub-exchanges.",
-                            "Target ads to a specific native content position."
+                            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                            "Target ads around locations of a business chain within a specific geo region.",
+                            "Target ads to a specific native content position.",
+                            "Target ads in an Open Measurement enabled inventory."
                           ],
                           "location": "path",
                           "pattern": "^[^/]+$",
@@ -4061,7 +4109,7 @@
                       "type": "string"
                     },
                     "targetingType": {
-                      "description": "Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
+                      "description": "Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
                       "enum": [
                         "TARGETING_TYPE_UNSPECIFIED",
                         "TARGETING_TYPE_CHANNEL",
@@ -4101,7 +4149,10 @@
                         "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                         "TARGETING_TYPE_EXCHANGE",
                         "TARGETING_TYPE_SUB_EXCHANGE",
-                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                        "TARGETING_TYPE_POI",
+                        "TARGETING_TYPE_BUSINESS_CHAIN",
+                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                        "TARGETING_TYPE_OMID"
                       ],
                       "enumDescriptions": [
                         "Default value when type is not specified or is unknown in this version.",
@@ -4142,7 +4193,10 @@
                         "Purchase impressions from a group of deals and auction packages.",
                         "Purchase impressions from specific exchanges.",
                         "Purchase impressions from specific sub-exchanges.",
-                        "Target ads to a specific native content position."
+                        "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                        "Target ads around locations of a business chain within a specific geo region.",
+                        "Target ads to a specific native content position.",
+                        "Target ads in an Open Measurement enabled inventory."
                       ],
                       "location": "path",
                       "pattern": "^[^/]+$",
@@ -4188,7 +4242,7 @@
                       "type": "string"
                     },
                     "targetingType": {
-                      "description": "Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
+                      "description": "Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
                       "enum": [
                         "TARGETING_TYPE_UNSPECIFIED",
                         "TARGETING_TYPE_CHANNEL",
@@ -4228,7 +4282,10 @@
                         "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                         "TARGETING_TYPE_EXCHANGE",
                         "TARGETING_TYPE_SUB_EXCHANGE",
-                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                        "TARGETING_TYPE_POI",
+                        "TARGETING_TYPE_BUSINESS_CHAIN",
+                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                        "TARGETING_TYPE_OMID"
                       ],
                       "enumDescriptions": [
                         "Default value when type is not specified or is unknown in this version.",
@@ -4269,7 +4326,10 @@
                         "Purchase impressions from a group of deals and auction packages.",
                         "Purchase impressions from specific exchanges.",
                         "Purchase impressions from specific sub-exchanges.",
-                        "Target ads to a specific native content position."
+                        "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                        "Target ads around locations of a business chain within a specific geo region.",
+                        "Target ads to a specific native content position.",
+                        "Target ads in an Open Measurement enabled inventory."
                       ],
                       "location": "path",
                       "pattern": "^[^/]+$",
@@ -4312,7 +4372,7 @@
                       "type": "string"
                     },
                     "targetingType": {
-                      "description": "Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
+                      "description": "Required. Identifies the type of this assigned targeting option. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
                       "enum": [
                         "TARGETING_TYPE_UNSPECIFIED",
                         "TARGETING_TYPE_CHANNEL",
@@ -4352,7 +4412,10 @@
                         "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                         "TARGETING_TYPE_EXCHANGE",
                         "TARGETING_TYPE_SUB_EXCHANGE",
-                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                        "TARGETING_TYPE_POI",
+                        "TARGETING_TYPE_BUSINESS_CHAIN",
+                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                        "TARGETING_TYPE_OMID"
                       ],
                       "enumDescriptions": [
                         "Default value when type is not specified or is unknown in this version.",
@@ -4393,7 +4456,10 @@
                         "Purchase impressions from a group of deals and auction packages.",
                         "Purchase impressions from specific exchanges.",
                         "Purchase impressions from specific sub-exchanges.",
-                        "Target ads to a specific native content position."
+                        "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                        "Target ads around locations of a business chain within a specific geo region.",
+                        "Target ads to a specific native content position.",
+                        "Target ads in an Open Measurement enabled inventory."
                       ],
                       "location": "path",
                       "pattern": "^[^/]+$",
@@ -4449,7 +4515,7 @@
                       "type": "string"
                     },
                     "targetingType": {
-                      "description": "Required. Identifies the type of assigned targeting options to list. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
+                      "description": "Required. Identifies the type of assigned targeting options to list. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
                       "enum": [
                         "TARGETING_TYPE_UNSPECIFIED",
                         "TARGETING_TYPE_CHANNEL",
@@ -4489,7 +4555,10 @@
                         "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                         "TARGETING_TYPE_EXCHANGE",
                         "TARGETING_TYPE_SUB_EXCHANGE",
-                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                        "TARGETING_TYPE_POI",
+                        "TARGETING_TYPE_BUSINESS_CHAIN",
+                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                        "TARGETING_TYPE_OMID"
                       ],
                       "enumDescriptions": [
                         "Default value when type is not specified or is unknown in this version.",
@@ -4530,7 +4599,10 @@
                         "Purchase impressions from a group of deals and auction packages.",
                         "Purchase impressions from specific exchanges.",
                         "Purchase impressions from specific sub-exchanges.",
-                        "Target ads to a specific native content position."
+                        "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                        "Target ads around locations of a business chain within a specific geo region.",
+                        "Target ads to a specific native content position.",
+                        "Target ads in an Open Measurement enabled inventory."
                       ],
                       "location": "path",
                       "pattern": "^[^/]+$",
@@ -6149,7 +6221,10 @@
                         "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                         "TARGETING_TYPE_EXCHANGE",
                         "TARGETING_TYPE_SUB_EXCHANGE",
-                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                        "TARGETING_TYPE_POI",
+                        "TARGETING_TYPE_BUSINESS_CHAIN",
+                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                        "TARGETING_TYPE_OMID"
                       ],
                       "enumDescriptions": [
                         "Default value when type is not specified or is unknown in this version.",
@@ -6190,7 +6265,10 @@
                         "Purchase impressions from a group of deals and auction packages.",
                         "Purchase impressions from specific exchanges.",
                         "Purchase impressions from specific sub-exchanges.",
-                        "Target ads to a specific native content position."
+                        "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                        "Target ads around locations of a business chain within a specific geo region.",
+                        "Target ads to a specific native content position.",
+                        "Target ads in an Open Measurement enabled inventory."
                       ],
                       "location": "path",
                       "pattern": "^[^/]+$",
@@ -6276,7 +6354,10 @@
                         "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                         "TARGETING_TYPE_EXCHANGE",
                         "TARGETING_TYPE_SUB_EXCHANGE",
-                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                        "TARGETING_TYPE_POI",
+                        "TARGETING_TYPE_BUSINESS_CHAIN",
+                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                        "TARGETING_TYPE_OMID"
                       ],
                       "enumDescriptions": [
                         "Default value when type is not specified or is unknown in this version.",
@@ -6317,7 +6398,10 @@
                         "Purchase impressions from a group of deals and auction packages.",
                         "Purchase impressions from specific exchanges.",
                         "Purchase impressions from specific sub-exchanges.",
-                        "Target ads to a specific native content position."
+                        "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                        "Target ads around locations of a business chain within a specific geo region.",
+                        "Target ads to a specific native content position.",
+                        "Target ads in an Open Measurement enabled inventory."
                       ],
                       "location": "path",
                       "pattern": "^[^/]+$",
@@ -6400,7 +6484,10 @@
                         "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                         "TARGETING_TYPE_EXCHANGE",
                         "TARGETING_TYPE_SUB_EXCHANGE",
-                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                        "TARGETING_TYPE_POI",
+                        "TARGETING_TYPE_BUSINESS_CHAIN",
+                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                        "TARGETING_TYPE_OMID"
                       ],
                       "enumDescriptions": [
                         "Default value when type is not specified or is unknown in this version.",
@@ -6441,7 +6528,10 @@
                         "Purchase impressions from a group of deals and auction packages.",
                         "Purchase impressions from specific exchanges.",
                         "Purchase impressions from specific sub-exchanges.",
-                        "Target ads to a specific native content position."
+                        "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                        "Target ads around locations of a business chain within a specific geo region.",
+                        "Target ads to a specific native content position.",
+                        "Target ads in an Open Measurement enabled inventory."
                       ],
                       "location": "path",
                       "pattern": "^[^/]+$",
@@ -6537,7 +6627,10 @@
                         "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                         "TARGETING_TYPE_EXCHANGE",
                         "TARGETING_TYPE_SUB_EXCHANGE",
-                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                        "TARGETING_TYPE_POI",
+                        "TARGETING_TYPE_BUSINESS_CHAIN",
+                        "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                        "TARGETING_TYPE_OMID"
                       ],
                       "enumDescriptions": [
                         "Default value when type is not specified or is unknown in this version.",
@@ -6578,7 +6671,10 @@
                         "Purchase impressions from a group of deals and auction packages.",
                         "Purchase impressions from specific exchanges.",
                         "Purchase impressions from specific sub-exchanges.",
-                        "Target ads to a specific native content position."
+                        "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                        "Target ads around locations of a business chain within a specific geo region.",
+                        "Target ads to a specific native content position.",
+                        "Target ads in an Open Measurement enabled inventory."
                       ],
                       "location": "path",
                       "pattern": "^[^/]+$",
@@ -6722,7 +6818,10 @@
                     "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                     "TARGETING_TYPE_EXCHANGE",
                     "TARGETING_TYPE_SUB_EXCHANGE",
-                    "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                    "TARGETING_TYPE_POI",
+                    "TARGETING_TYPE_BUSINESS_CHAIN",
+                    "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                    "TARGETING_TYPE_OMID"
                   ],
                   "enumDescriptions": [
                     "Default value when type is not specified or is unknown in this version.",
@@ -6763,7 +6862,10 @@
                     "Purchase impressions from a group of deals and auction packages.",
                     "Purchase impressions from specific exchanges.",
                     "Purchase impressions from specific sub-exchanges.",
-                    "Target ads to a specific native content position."
+                    "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                    "Target ads around locations of a business chain within a specific geo region.",
+                    "Target ads to a specific native content position.",
+                    "Target ads in an Open Measurement enabled inventory."
                   ],
                   "location": "path",
                   "pattern": "^[^/]+$",
@@ -6856,7 +6958,10 @@
                     "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                     "TARGETING_TYPE_EXCHANGE",
                     "TARGETING_TYPE_SUB_EXCHANGE",
-                    "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                    "TARGETING_TYPE_POI",
+                    "TARGETING_TYPE_BUSINESS_CHAIN",
+                    "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                    "TARGETING_TYPE_OMID"
                   ],
                   "enumDescriptions": [
                     "Default value when type is not specified or is unknown in this version.",
@@ -6897,7 +7002,10 @@
                     "Purchase impressions from a group of deals and auction packages.",
                     "Purchase impressions from specific exchanges.",
                     "Purchase impressions from specific sub-exchanges.",
-                    "Target ads to a specific native content position."
+                    "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                    "Target ads around locations of a business chain within a specific geo region.",
+                    "Target ads to a specific native content position.",
+                    "Target ads in an Open Measurement enabled inventory."
                   ],
                   "location": "path",
                   "pattern": "^[^/]+$",
@@ -6923,7 +7031,7 @@
               ],
               "parameters": {
                 "targetingType": {
-                  "description": "Required. The type of targeting options to retrieve. Accepted values are: * `TARGETING_TYPE_GEO_REGION`",
+                  "description": "Required. The type of targeting options to retrieve. Accepted values are: * `TARGETING_TYPE_GEO_REGION` * `TARGETING_TYPE_POI` * `TARGETING_TYPE_BUSINESS_CHAIN`",
                   "enum": [
                     "TARGETING_TYPE_UNSPECIFIED",
                     "TARGETING_TYPE_CHANNEL",
@@ -6963,7 +7071,10 @@
                     "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
                     "TARGETING_TYPE_EXCHANGE",
                     "TARGETING_TYPE_SUB_EXCHANGE",
-                    "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+                    "TARGETING_TYPE_POI",
+                    "TARGETING_TYPE_BUSINESS_CHAIN",
+                    "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+                    "TARGETING_TYPE_OMID"
                   ],
                   "enumDescriptions": [
                     "Default value when type is not specified or is unknown in this version.",
@@ -7004,7 +7115,10 @@
                     "Purchase impressions from a group of deals and auction packages.",
                     "Purchase impressions from specific exchanges.",
                     "Purchase impressions from specific sub-exchanges.",
-                    "Target ads to a specific native content position."
+                    "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+                    "Target ads around locations of a business chain within a specific geo region.",
+                    "Target ads to a specific native content position.",
+                    "Target ads in an Open Measurement enabled inventory."
                   ],
                   "location": "path",
                   "pattern": "^[^/]+$",
@@ -7203,7 +7317,7 @@
       }
     }
   },
-  "revision": "20210708",
+  "revision": "20210722",
   "rootUrl": "https://displayvideo.googleapis.com/",
   "schemas": {
     "ActivateManualTriggerRequest": {
@@ -7836,6 +7950,10 @@
           "$ref": "BrowserAssignedTargetingOptionDetails",
           "description": "Browser details. This field will be populated when the targeting_type is `TARGETING_TYPE_BROWSER`."
         },
+        "businessChainDetails": {
+          "$ref": "BusinessChainAssignedTargetingOptionDetails",
+          "description": "Business chain details. This field will be populated when the targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`."
+        },
         "carrierAndIspDetails": {
           "$ref": "CarrierAndIspAssignedTargetingOptionDetails",
           "description": "Carrier and ISP details. This field will be populated when the targeting_type is `TARGETING_TYPE_CARRIER_AND_ISP`."
@@ -7938,6 +8056,10 @@
           "$ref": "NegativeKeywordListAssignedTargetingOptionDetails",
           "description": "Keyword details. This field will be populated when the targeting_type is `TARGETING_TYPE_NEGATIVE_KEYWORD_LIST`. A maximum of 4 negative keyword lists can be assigned to a resource."
         },
+        "omidDetails": {
+          "$ref": "OmidAssignedTargetingOptionDetails",
+          "description": "Open Measurement enabled inventory details. This field will be populated when the targeting_type is `TARGETING_TYPE_OMID`."
+        },
         "onScreenPositionDetails": {
           "$ref": "OnScreenPositionAssignedTargetingOptionDetails",
           "description": "On screen position details. This field will be populated when the targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`."
@@ -7950,6 +8072,10 @@
           "$ref": "ParentalStatusAssignedTargetingOptionDetails",
           "description": "Parental status details. This field will be populated when the targeting_type is `TARGETING_TYPE_PARENTAL_STATUS`."
         },
+        "poiDetails": {
+          "$ref": "PoiAssignedTargetingOptionDetails",
+          "description": "POI details. This field will be populated when the targeting_type is `TARGETING_TYPE_POI`."
+        },
         "proximityLocationListDetails": {
           "$ref": "ProximityLocationListAssignedTargetingOptionDetails",
           "description": "Proximity location list details. This field will be populated when the targeting_type is `TARGETING_TYPE_PROXIMITY_LOCATION_LIST`."
@@ -8007,7 +8133,10 @@
             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
             "TARGETING_TYPE_EXCHANGE",
             "TARGETING_TYPE_SUB_EXCHANGE",
-            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+            "TARGETING_TYPE_POI",
+            "TARGETING_TYPE_BUSINESS_CHAIN",
+            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+            "TARGETING_TYPE_OMID"
           ],
           "enumDescriptions": [
             "Default value when type is not specified or is unknown in this version.",
@@ -8048,7 +8177,10 @@
             "Purchase impressions from a group of deals and auction packages.",
             "Purchase impressions from specific exchanges.",
             "Purchase impressions from specific sub-exchanges.",
-            "Target ads to a specific native content position."
+            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+            "Target ads around locations of a business chain within a specific geo region.",
+            "Target ads to a specific native content position.",
+            "Target ads in an Open Measurement enabled inventory."
           ],
           "readOnly": true,
           "type": "string"
@@ -8362,14 +8494,14 @@
       "id": "BulkEditAdvertiserAssignedTargetingOptionsRequest",
       "properties": {
         "createRequests": {
-          "description": "The assigned targeting options to create in batch, specified as a list of `CreateAssignedTargetingOptionsRequest`. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
+          "description": "The assigned targeting options to create in batch, specified as a list of `CreateAssignedTargetingOptionsRequest`. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
           "items": {
             "$ref": "CreateAssignedTargetingOptionsRequest"
           },
           "type": "array"
         },
         "deleteRequests": {
-          "description": "The assigned targeting options to delete in batch, specified as a list of `DeleteAssignedTargetingOptionsRequest`. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
+          "description": "The assigned targeting options to delete in batch, specified as a list of `DeleteAssignedTargetingOptionsRequest`. Supported targeting types: * `TARGETING_TYPE_CHANNEL` * `TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION` * `TARGETING_TYPE_OMID` * `TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION`",
           "items": {
             "$ref": "DeleteAssignedTargetingOptionsRequest"
           },
@@ -8725,6 +8857,140 @@
       },
       "type": "object"
     },
+    "BusinessChainAssignedTargetingOptionDetails": {
+      "description": "Details for assigned Business chain targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.",
+      "id": "BusinessChainAssignedTargetingOptionDetails",
+      "properties": {
+        "displayName": {
+          "description": "Output only. The display name of a business chain, e.g. \"KFC\", \"Chase Bank\".",
+          "readOnly": true,
+          "type": "string"
+        },
+        "proximityRadiusAmount": {
+          "description": "Required. The radius of the area around the business chain that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`. The minimum increment for both cases is 0.1. Inputs will be rounded to the nearest acceptable value if it is too granular, e.g. 15.57 will become 15.6.",
+          "format": "double",
+          "type": "number"
+        },
+        "proximityRadiusUnit": {
+          "description": "Required. The unit of distance by which the targeting radius is measured.",
+          "enum": [
+            "DISTANCE_UNIT_UNSPECIFIED",
+            "DISTANCE_UNIT_MILES",
+            "DISTANCE_UNIT_KILOMETERS"
+          ],
+          "enumDescriptions": [
+            "Type value is not specified or is unknown in this version.",
+            "Miles.",
+            "Kilometers."
+          ],
+          "type": "string"
+        },
+        "targetingOptionId": {
+          "description": "Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_BUSINESS_CHAIN`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "BusinessChainSearchTerms": {
+      "description": "Search terms for Business Chain targeting options. At least one of the field should be populated.",
+      "id": "BusinessChainSearchTerms",
+      "properties": {
+        "businessChain": {
+          "description": "The search query for the desired business chain. The query can be a prefix, e.g. \"KFC\", \"mercede\".",
+          "type": "string"
+        },
+        "region": {
+          "description": "The search query for the desired geo region, e.g. \"Seattle\", \"United State\".",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "BusinessChainTargetingOptionDetails": {
+      "description": "Represents a targetable business chain within a geo region. This will be populated in the business_chain_details field when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`.",
+      "id": "BusinessChainTargetingOptionDetails",
+      "properties": {
+        "businessChain": {
+          "description": "Output only. The display name of the business chain, e.g. \"KFC\", \"Chase Bank\".",
+          "readOnly": true,
+          "type": "string"
+        },
+        "geoRegion": {
+          "description": "Output only. The display name of the geographic region, e.g. \"Ontario, Canada\".",
+          "readOnly": true,
+          "type": "string"
+        },
+        "geoRegionType": {
+          "description": "Output only. The type of the geographic region.",
+          "enum": [
+            "GEO_REGION_TYPE_UNKNOWN",
+            "GEO_REGION_TYPE_OTHER",
+            "GEO_REGION_TYPE_COUNTRY",
+            "GEO_REGION_TYPE_REGION",
+            "GEO_REGION_TYPE_TERRITORY",
+            "GEO_REGION_TYPE_PROVINCE",
+            "GEO_REGION_TYPE_STATE",
+            "GEO_REGION_TYPE_PREFECTURE",
+            "GEO_REGION_TYPE_GOVERNORATE",
+            "GEO_REGION_TYPE_CANTON",
+            "GEO_REGION_TYPE_UNION_TERRITORY",
+            "GEO_REGION_TYPE_AUTONOMOUS_COMMUNITY",
+            "GEO_REGION_TYPE_DMA_REGION",
+            "GEO_REGION_TYPE_METRO",
+            "GEO_REGION_TYPE_CONGRESSIONAL_DISTRICT",
+            "GEO_REGION_TYPE_COUNTY",
+            "GEO_REGION_TYPE_MUNICIPALITY",
+            "GEO_REGION_TYPE_CITY",
+            "GEO_REGION_TYPE_POSTAL_CODE",
+            "GEO_REGION_TYPE_DEPARTMENT",
+            "GEO_REGION_TYPE_AIRPORT",
+            "GEO_REGION_TYPE_TV_REGION",
+            "GEO_REGION_TYPE_OKRUG",
+            "GEO_REGION_TYPE_BOROUGH",
+            "GEO_REGION_TYPE_CITY_REGION",
+            "GEO_REGION_TYPE_ARRONDISSEMENT",
+            "GEO_REGION_TYPE_NEIGHBORHOOD",
+            "GEO_REGION_TYPE_UNIVERSITY",
+            "GEO_REGION_TYPE_DISTRICT"
+          ],
+          "enumDescriptions": [
+            "The geographic region type is unknown.",
+            "The geographic region type is other.",
+            "The geographic region is a country.",
+            "The geographic region type is region.",
+            "The geographic region is a territory.",
+            "The geographic region is a province.",
+            "The geographic region is a state.",
+            "The geographic region is a prefecture.",
+            "The geographic region is a governorate.",
+            "The geographic region is a canton.",
+            "The geographic region is a union territory.",
+            "The geographic region is an autonomous community.",
+            "The geographic region is a designated market area (DMA) region.",
+            "The geographic region type is metro.",
+            "The geographic region is a congressional district.",
+            "The geographic region is a county.",
+            "The geographic region is a municipality.",
+            "The geographic region is a city.",
+            "The geographic region targeting type is postal code.",
+            "The geographic region targeting type is department.",
+            "The geographic region is an airport.",
+            "The geographic region is a TV region.",
+            "The geographic region is an okrug.",
+            "The geographic region is a borough.",
+            "The geographic region is a city region.",
+            "The geographic region is an arrondissement.",
+            "The geographic region is a neighborhood.",
+            "The geographic region is a university.",
+            "The geographic region is a district."
+          ],
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "Campaign": {
       "description": "A single campaign.",
       "id": "Campaign",
@@ -9413,7 +9679,10 @@
             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
             "TARGETING_TYPE_EXCHANGE",
             "TARGETING_TYPE_SUB_EXCHANGE",
-            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+            "TARGETING_TYPE_POI",
+            "TARGETING_TYPE_BUSINESS_CHAIN",
+            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+            "TARGETING_TYPE_OMID"
           ],
           "enumDescriptions": [
             "Default value when type is not specified or is unknown in this version.",
@@ -9454,7 +9723,10 @@
             "Purchase impressions from a group of deals and auction packages.",
             "Purchase impressions from specific exchanges.",
             "Purchase impressions from specific sub-exchanges.",
-            "Target ads to a specific native content position."
+            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+            "Target ads around locations of a business chain within a specific geo region.",
+            "Target ads to a specific native content position.",
+            "Target ads in an Open Measurement enabled inventory."
           ],
           "type": "string"
         }
@@ -10192,7 +10464,10 @@
             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
             "TARGETING_TYPE_EXCHANGE",
             "TARGETING_TYPE_SUB_EXCHANGE",
-            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+            "TARGETING_TYPE_POI",
+            "TARGETING_TYPE_BUSINESS_CHAIN",
+            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+            "TARGETING_TYPE_OMID"
           ],
           "enumDescriptions": [
             "Default value when type is not specified or is unknown in this version.",
@@ -10233,7 +10508,10 @@
             "Purchase impressions from a group of deals and auction packages.",
             "Purchase impressions from specific exchanges.",
             "Purchase impressions from specific sub-exchanges.",
-            "Target ads to a specific native content position."
+            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+            "Target ads around locations of a business chain within a specific geo region.",
+            "Target ads to a specific native content position.",
+            "Target ads in an Open Measurement enabled inventory."
           ],
           "type": "string"
         }
@@ -14276,6 +14554,50 @@
       },
       "type": "object"
     },
+    "OmidAssignedTargetingOptionDetails": {
+      "description": "Represents a targetable Open Measurement enabled inventory type. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_OMID`.",
+      "id": "OmidAssignedTargetingOptionDetails",
+      "properties": {
+        "omid": {
+          "description": "Output only. The type of Open Measurement enabled inventory.",
+          "enum": [
+            "OMID_UNSPECIFIED",
+            "OMID_FOR_MOBILE_DISPLAY_ADS"
+          ],
+          "enumDescriptions": [
+            "Default value when omid targeting is not specified in this version.",
+            "Open Measurement enabled mobile display inventory."
+          ],
+          "readOnly": true,
+          "type": "string"
+        },
+        "targetingOptionId": {
+          "description": "Required. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_OMID`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "OmidTargetingOptionDetails": {
+      "description": "Represents a targetable Open Measurement enabled inventory type. This will be populated in the omid_details field when targeting_type is `TARGETING_TYPE_OMID`.",
+      "id": "OmidTargetingOptionDetails",
+      "properties": {
+        "omid": {
+          "description": "Output only. The type of Open Measurement enabled inventory.",
+          "enum": [
+            "OMID_UNSPECIFIED",
+            "OMID_FOR_MOBILE_DISPLAY_ADS"
+          ],
+          "enumDescriptions": [
+            "Default value when omid targeting is not specified in this version.",
+            "Open Measurement enabled mobile display inventory."
+          ],
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "OnScreenPositionAssignedTargetingOptionDetails": {
       "description": "On screen position targeting option details. This will be populated in the on_screen_position_details field when targeting_type is `TARGETING_TYPE_ON_SCREEN_POSITION`.",
       "id": "OnScreenPositionAssignedTargetingOptionDetails",
@@ -14921,6 +15243,88 @@
       },
       "type": "object"
     },
+    "PoiAssignedTargetingOptionDetails": {
+      "description": "Details for assigned POI targeting option. This will be populated in the details field of an AssignedTargetingOption when targeting_type is `TARGETING_TYPE_POI`.",
+      "id": "PoiAssignedTargetingOptionDetails",
+      "properties": {
+        "displayName": {
+          "description": "Output only. The display name of a POI, e.g. \"Times Square\", \"Space Needle\".",
+          "readOnly": true,
+          "type": "string"
+        },
+        "latitude": {
+          "description": "Output only. Latitude of the POI rounding to 6th decimal place.",
+          "format": "double",
+          "readOnly": true,
+          "type": "number"
+        },
+        "longitude": {
+          "description": "Output only. Longitude of the POI rounding to 6th decimal place.",
+          "format": "double",
+          "readOnly": true,
+          "type": "number"
+        },
+        "proximityRadiusAmount": {
+          "description": "Required. The radius of the area around the POI that will be targeted. The units of the radius are specified by proximity_radius_unit. Must be 1 to 800 if unit is `DISTANCE_UNIT_KILOMETERS` and 1 to 500 if unit is `DISTANCE_UNIT_MILES`.",
+          "format": "double",
+          "type": "number"
+        },
+        "proximityRadiusUnit": {
+          "description": "Required. The unit of distance by which the targeting radius is measured.",
+          "enum": [
+            "DISTANCE_UNIT_UNSPECIFIED",
+            "DISTANCE_UNIT_MILES",
+            "DISTANCE_UNIT_KILOMETERS"
+          ],
+          "enumDescriptions": [
+            "Type value is not specified or is unknown in this version.",
+            "Miles.",
+            "Kilometers."
+          ],
+          "type": "string"
+        },
+        "targetingOptionId": {
+          "description": "Input only. The targeting_option_id of a TargetingOption of type `TARGETING_TYPE_POI`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "PoiSearchTerms": {
+      "description": "Search terms for POI targeting options.",
+      "id": "PoiSearchTerms",
+      "properties": {
+        "poiQuery": {
+          "description": "The search query for the desired POI name, street address, or coordinate of the desired POI. The query can be a prefix, e.g. \"Times squar\", \"40.7505045,-73.99562\", \"315 W 44th St\", etc.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "PoiTargetingOptionDetails": {
+      "description": "Represents a targetable point of interest(POI). This will be populated in the poi_details field when targeting_type is `TARGETING_TYPE_POI`.",
+      "id": "PoiTargetingOptionDetails",
+      "properties": {
+        "displayName": {
+          "description": "Output only. The display name of a POI, e.g. \"Times Square\", \"Space Needle\".",
+          "readOnly": true,
+          "type": "string"
+        },
+        "latitude": {
+          "description": "Output only. Latitude of the POI rounding to 6th decimal place.",
+          "format": "double",
+          "readOnly": true,
+          "type": "number"
+        },
+        "longitude": {
+          "description": "Output only. Longitude of the POI rounding to 6th decimal place.",
+          "format": "double",
+          "readOnly": true,
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
     "PrismaConfig": {
       "description": "Settings specific to the Mediaocean Prisma tool.",
       "id": "PrismaConfig",
@@ -15324,6 +15728,10 @@
           "format": "int64",
           "type": "string"
         },
+        "businessChainSearchTerms": {
+          "$ref": "BusinessChainSearchTerms",
+          "description": "Search terms for Business Chain targeting options. Can only be used when targeting_type is `TARGETING_TYPE_BUSINESS_CHAIN`."
+        },
         "geoRegionSearchTerms": {
           "$ref": "GeoRegionSearchTerms",
           "description": "Search terms for geo region targeting options. Can only be used when targeting_type is `TARGETING_TYPE_GEO_REGION`."
@@ -15336,6 +15744,10 @@
         "pageToken": {
           "description": "A token identifying a page of results the server should return. Typically, this is the value of next_page_token returned from the previous call to `SearchTargetingOptions` method. If not specified, the first page of results will be returned.",
           "type": "string"
+        },
+        "poiSearchTerms": {
+          "$ref": "PoiSearchTerms",
+          "description": "Search terms for POI targeting options. Can only be used when targeting_type is `TARGETING_TYPE_POI`."
         }
       },
       "type": "object"
@@ -15585,6 +15997,10 @@
           "$ref": "BrowserTargetingOptionDetails",
           "description": "Browser details."
         },
+        "businessChainDetails": {
+          "$ref": "BusinessChainTargetingOptionDetails",
+          "description": "Business chain resource details."
+        },
         "carrierAndIspDetails": {
           "$ref": "CarrierAndIspTargetingOptionDetails",
           "description": "Carrier and ISP details."
@@ -15646,6 +16062,10 @@
           "$ref": "NativeContentPositionTargetingOptionDetails",
           "description": "Native content position details."
         },
+        "omidDetails": {
+          "$ref": "OmidTargetingOptionDetails",
+          "description": "Open Measurement enabled inventory details."
+        },
         "onScreenPositionDetails": {
           "$ref": "OnScreenPositionTargetingOptionDetails",
           "description": "On screen position details."
@@ -15658,6 +16078,10 @@
           "$ref": "ParentalStatusTargetingOptionDetails",
           "description": "Parental status details."
         },
+        "poiDetails": {
+          "$ref": "PoiTargetingOptionDetails",
+          "description": "POI resource details."
+        },
         "sensitiveCategoryDetails": {
           "$ref": "SensitiveCategoryTargetingOptionDetails",
           "description": "Sensitive Category details."
@@ -15712,7 +16136,10 @@
             "TARGETING_TYPE_INVENTORY_SOURCE_GROUP",
             "TARGETING_TYPE_EXCHANGE",
             "TARGETING_TYPE_SUB_EXCHANGE",
-            "TARGETING_TYPE_NATIVE_CONTENT_POSITION"
+            "TARGETING_TYPE_POI",
+            "TARGETING_TYPE_BUSINESS_CHAIN",
+            "TARGETING_TYPE_NATIVE_CONTENT_POSITION",
+            "TARGETING_TYPE_OMID"
           ],
           "enumDescriptions": [
             "Default value when type is not specified or is unknown in this version.",
@@ -15753,7 +16180,10 @@
             "Purchase impressions from a group of deals and auction packages.",
             "Purchase impressions from specific exchanges.",
             "Purchase impressions from specific sub-exchanges.",
-            "Target ads to a specific native content position."
+            "Target ads around a specific point of interest, such as a notable building, a street address, or latitude/longitude coordinates.",
+            "Target ads around locations of a business chain within a specific geo region.",
+            "Target ads to a specific native content position.",
+            "Target ads in an Open Measurement enabled inventory."
           ],
           "readOnly": true,
           "type": "string"
diff --git a/googleapiclient/discovery_cache/documents/dlp.v2.json b/googleapiclient/discovery_cache/documents/dlp.v2.json
index 951b53a..fc70e28 100644
--- a/googleapiclient/discovery_cache/documents/dlp.v2.json
+++ b/googleapiclient/discovery_cache/documents/dlp.v2.json
@@ -3412,7 +3412,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://dlp.googleapis.com/",
   "schemas": {
     "GooglePrivacyDlpV2Action": {
diff --git a/googleapiclient/discovery_cache/documents/dns.v1.json b/googleapiclient/discovery_cache/documents/dns.v1.json
index 08673fa..f7a872b 100644
--- a/googleapiclient/discovery_cache/documents/dns.v1.json
+++ b/googleapiclient/discovery_cache/documents/dns.v1.json
@@ -1235,7 +1235,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210717",
   "rootUrl": "https://dns.googleapis.com/",
   "schemas": {
     "Change": {
diff --git a/googleapiclient/discovery_cache/documents/dns.v1beta2.json b/googleapiclient/discovery_cache/documents/dns.v1beta2.json
index 2abb182..fd02903 100644
--- a/googleapiclient/discovery_cache/documents/dns.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/dns.v1beta2.json
@@ -1730,7 +1730,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210717",
   "rootUrl": "https://dns.googleapis.com/",
   "schemas": {
     "Change": {
@@ -2606,6 +2606,11 @@
           "format": "int32",
           "type": "integer"
         },
+        "itemsPerRoutingPolicy": {
+          "description": "Maximum allowed number of items per routing policy.",
+          "format": "int32",
+          "type": "integer"
+        },
         "kind": {
           "default": "dns#quota",
           "type": "string"
@@ -2690,6 +2695,124 @@
       },
       "type": "object"
     },
+    "RRSetRoutingPolicy": {
+      "description": "A RRSetRoutingPolicy represents ResourceRecordSet data that is returned dynamically with the response varying based on configured properties such as geolocation or by weighted random selection.",
+      "id": "RRSetRoutingPolicy",
+      "properties": {
+        "geo": {
+          "$ref": "RRSetRoutingPolicyGeoPolicy"
+        },
+        "geoPolicy": {
+          "$ref": "RRSetRoutingPolicyGeoPolicy"
+        },
+        "kind": {
+          "default": "dns#rRSetRoutingPolicy",
+          "type": "string"
+        },
+        "wrr": {
+          "$ref": "RRSetRoutingPolicyWrrPolicy"
+        },
+        "wrrPolicy": {
+          "$ref": "RRSetRoutingPolicyWrrPolicy"
+        }
+      },
+      "type": "object"
+    },
+    "RRSetRoutingPolicyGeoPolicy": {
+      "id": "RRSetRoutingPolicyGeoPolicy",
+      "properties": {
+        "failovers": {
+          "description": "If the health check for the primary target for a geo location returns an unhealthy status, the failover target is returned instead. This failover configuration is not mandatory. If a failover is not provided, the primary target won't be healthchecked, and it returns the primarily configured rrdata irrespective of whether it is healthy or not.",
+          "items": {
+            "$ref": "RRSetRoutingPolicyGeoPolicyGeoPolicyItem"
+          },
+          "type": "array"
+        },
+        "items": {
+          "description": "The primary geo routing configuration. If there are multiple items with the same location, an error is returned instead.",
+          "items": {
+            "$ref": "RRSetRoutingPolicyGeoPolicyGeoPolicyItem"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "default": "dns#rRSetRoutingPolicyGeoPolicy",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "RRSetRoutingPolicyGeoPolicyGeoPolicyItem": {
+      "id": "RRSetRoutingPolicyGeoPolicyGeoPolicyItem",
+      "properties": {
+        "kind": {
+          "default": "dns#rRSetRoutingPolicyGeoPolicyGeoPolicyItem",
+          "type": "string"
+        },
+        "location": {
+          "description": "The geo-location granularity is a GCP region. This location string should correspond to a GCP region. e.g. \"us-east1\", \"southamerica-east1\", \"asia-east1\", etc.",
+          "type": "string"
+        },
+        "rrdatas": {
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "signatureRrdatas": {
+          "description": "DNSSEC generated signatures for the above geo_rrdata.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "RRSetRoutingPolicyWrrPolicy": {
+      "id": "RRSetRoutingPolicyWrrPolicy",
+      "properties": {
+        "items": {
+          "items": {
+            "$ref": "RRSetRoutingPolicyWrrPolicyWrrPolicyItem"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "default": "dns#rRSetRoutingPolicyWrrPolicy",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "RRSetRoutingPolicyWrrPolicyWrrPolicyItem": {
+      "id": "RRSetRoutingPolicyWrrPolicyWrrPolicyItem",
+      "properties": {
+        "kind": {
+          "default": "dns#rRSetRoutingPolicyWrrPolicyWrrPolicyItem",
+          "type": "string"
+        },
+        "rrdatas": {
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "signatureRrdatas": {
+          "description": "DNSSEC generated signatures for the above wrr_rrdata.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "weight": {
+          "description": "The weight corresponding to this subset of rrdata. When multiple WeightedRoundRobinPolicyItems are configured, the probability of returning an rrset is proportional to its weight relative to the sum of weights configured for all items. This weight should be non-negative.",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
     "ResourceRecordSet": {
       "description": "A unit of data that is returned by the DNS servers.",
       "id": "ResourceRecordSet",
@@ -2702,6 +2825,10 @@
           "description": "For example, www.example.com.",
           "type": "string"
         },
+        "routingPolicy": {
+          "$ref": "RRSetRoutingPolicy",
+          "description": "Configures dynamic query responses based on geo location of querying user or a weighted round robin based routing policy. A ResourceRecordSet should only have either rrdata (static) or routing_policy (dynamic). An error is returned otherwise."
+        },
         "rrdatas": {
           "description": "As defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1) -- see examples.",
           "items": {
diff --git a/googleapiclient/discovery_cache/documents/docs.v1.json b/googleapiclient/discovery_cache/documents/docs.v1.json
index 8bf365a..de77ebf 100644
--- a/googleapiclient/discovery_cache/documents/docs.v1.json
+++ b/googleapiclient/discovery_cache/documents/docs.v1.json
@@ -216,7 +216,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://docs.googleapis.com/",
   "schemas": {
     "AutoText": {
diff --git a/googleapiclient/discovery_cache/documents/documentai.v1.json b/googleapiclient/discovery_cache/documents/documentai.v1.json
index dca1ace..33093ec 100644
--- a/googleapiclient/discovery_cache/documents/documentai.v1.json
+++ b/googleapiclient/discovery_cache/documents/documentai.v1.json
@@ -664,7 +664,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210719",
   "rootUrl": "https://documentai.googleapis.com/",
   "schemas": {
     "GoogleCloudDocumentaiUiv1beta3CommonOperationMetadata": {
diff --git a/googleapiclient/discovery_cache/documents/documentai.v1beta2.json b/googleapiclient/discovery_cache/documents/documentai.v1beta2.json
index f4ea60e..2458f79 100644
--- a/googleapiclient/discovery_cache/documents/documentai.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/documentai.v1beta2.json
@@ -292,7 +292,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210719",
   "rootUrl": "https://documentai.googleapis.com/",
   "schemas": {
     "GoogleCloudDocumentaiUiv1beta3CommonOperationMetadata": {
diff --git a/googleapiclient/discovery_cache/documents/documentai.v1beta3.json b/googleapiclient/discovery_cache/documents/documentai.v1beta3.json
index 9b0fea7..30e6d7e 100644
--- a/googleapiclient/discovery_cache/documents/documentai.v1beta3.json
+++ b/googleapiclient/discovery_cache/documents/documentai.v1beta3.json
@@ -601,7 +601,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210719",
   "rootUrl": "https://documentai.googleapis.com/",
   "schemas": {
     "GoogleCloudDocumentaiUiv1beta3CommonOperationMetadata": {
diff --git a/googleapiclient/discovery_cache/documents/domains.v1alpha2.json b/googleapiclient/discovery_cache/documents/domains.v1alpha2.json
index fa335ba..a02c427 100644
--- a/googleapiclient/discovery_cache/documents/domains.v1alpha2.json
+++ b/googleapiclient/discovery_cache/documents/domains.v1alpha2.json
@@ -721,7 +721,7 @@
       }
     }
   },
-  "revision": "20210629",
+  "revision": "20210717",
   "rootUrl": "https://domains.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/domainsrdap.v1.json b/googleapiclient/discovery_cache/documents/domainsrdap.v1.json
index b94d04d..bdc4507 100644
--- a/googleapiclient/discovery_cache/documents/domainsrdap.v1.json
+++ b/googleapiclient/discovery_cache/documents/domainsrdap.v1.json
@@ -289,7 +289,7 @@
       }
     }
   },
-  "revision": "20210719",
+  "revision": "20210723",
   "rootUrl": "https://domainsrdap.googleapis.com/",
   "schemas": {
     "HttpBody": {
diff --git a/googleapiclient/discovery_cache/documents/doubleclickbidmanager.v1.1.json b/googleapiclient/discovery_cache/documents/doubleclickbidmanager.v1.1.json
index f814891..3878513 100644
--- a/googleapiclient/discovery_cache/documents/doubleclickbidmanager.v1.1.json
+++ b/googleapiclient/discovery_cache/documents/doubleclickbidmanager.v1.1.json
@@ -280,7 +280,7 @@
       }
     }
   },
-  "revision": "20210629",
+  "revision": "20210721",
   "rootUrl": "https://doubleclickbidmanager.googleapis.com/",
   "schemas": {
     "ChannelGrouping": {
@@ -2020,7 +2020,8 @@
               "METRIC_PERCENTAGE_FROM_CURRENT_IO_GOAL",
               "METRIC_DUPLICATE_FLOODLIGHT_IMPRESSIONS",
               "METRIC_COOKIE_CONSENTED_FLOODLIGHT_IMPRESSIONS",
-              "METRIC_COOKIE_UNCONSENTED_FLOODLIGHT_IMPRESSIONS"
+              "METRIC_COOKIE_UNCONSENTED_FLOODLIGHT_IMPRESSIONS",
+              "METRIC_TRACKING_UNCONSENTED_CLICKS"
             ],
             "enumDescriptions": [
               "",
@@ -2481,6 +2482,7 @@
               "",
               "",
               "",
+              "",
               ""
             ],
             "type": "string"
diff --git a/googleapiclient/discovery_cache/documents/doubleclickbidmanager.v1.json b/googleapiclient/discovery_cache/documents/doubleclickbidmanager.v1.json
index d97fa12..29df71e 100644
--- a/googleapiclient/discovery_cache/documents/doubleclickbidmanager.v1.json
+++ b/googleapiclient/discovery_cache/documents/doubleclickbidmanager.v1.json
@@ -96,7 +96,7 @@
   },
   "protocol": "rest",
   "resources": {},
-  "revision": "20210629",
+  "revision": "20210721",
   "rootUrl": "https://doubleclickbidmanager.googleapis.com/",
   "schemas": {},
   "servicePath": "doubleclickbidmanager/v1/",
diff --git a/googleapiclient/discovery_cache/documents/doubleclicksearch.v2.json b/googleapiclient/discovery_cache/documents/doubleclicksearch.v2.json
index 3817acb..c81e68e 100644
--- a/googleapiclient/discovery_cache/documents/doubleclicksearch.v2.json
+++ b/googleapiclient/discovery_cache/documents/doubleclicksearch.v2.json
@@ -399,7 +399,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://doubleclicksearch.googleapis.com/",
   "schemas": {
     "Availability": {
diff --git a/googleapiclient/discovery_cache/documents/drive.v2.json b/googleapiclient/discovery_cache/documents/drive.v2.json
index 21a0141..9462a6e 100644
--- a/googleapiclient/discovery_cache/documents/drive.v2.json
+++ b/googleapiclient/discovery_cache/documents/drive.v2.json
@@ -38,7 +38,7 @@
   "description": "Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/drive/",
-  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/wVU03Ppwd5ggXGhnpKZIvZMbgyQ\"",
+  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/3C2SqaIsGtaKNfA_Qui6Cbm4VKo\"",
   "icons": {
     "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png",
     "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png"
@@ -3527,7 +3527,7 @@
       }
     }
   },
-  "revision": "20210711",
+  "revision": "20210719",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "About": {
diff --git a/googleapiclient/discovery_cache/documents/drive.v3.json b/googleapiclient/discovery_cache/documents/drive.v3.json
index e31ec52..ff63d9f 100644
--- a/googleapiclient/discovery_cache/documents/drive.v3.json
+++ b/googleapiclient/discovery_cache/documents/drive.v3.json
@@ -35,7 +35,7 @@
   "description": "Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/drive/",
-  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/VonNZXFgC6DHBVYBUSgfHu7sXik\"",
+  "etag": "\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/_Lvps3-KgyI7_IwBA-9lM1tZSh4\"",
   "icons": {
     "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png",
     "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png"
@@ -2191,7 +2191,7 @@
       }
     }
   },
-  "revision": "20210711",
+  "revision": "20210719",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "About": {
diff --git a/googleapiclient/discovery_cache/documents/driveactivity.v2.json b/googleapiclient/discovery_cache/documents/driveactivity.v2.json
index 3516f3d..a4f3f1c 100644
--- a/googleapiclient/discovery_cache/documents/driveactivity.v2.json
+++ b/googleapiclient/discovery_cache/documents/driveactivity.v2.json
@@ -132,7 +132,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://driveactivity.googleapis.com/",
   "schemas": {
     "Action": {
diff --git a/googleapiclient/discovery_cache/documents/essentialcontacts.v1.json b/googleapiclient/discovery_cache/documents/essentialcontacts.v1.json
index 349090d..8d7da23 100644
--- a/googleapiclient/discovery_cache/documents/essentialcontacts.v1.json
+++ b/googleapiclient/discovery_cache/documents/essentialcontacts.v1.json
@@ -850,7 +850,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://essentialcontacts.googleapis.com/",
   "schemas": {
     "GoogleCloudEssentialcontactsV1ComputeContactsResponse": {
diff --git a/googleapiclient/discovery_cache/documents/eventarc.v1.json b/googleapiclient/discovery_cache/documents/eventarc.v1.json
index 9939922..f91df0e 100644
--- a/googleapiclient/discovery_cache/documents/eventarc.v1.json
+++ b/googleapiclient/discovery_cache/documents/eventarc.v1.json
@@ -177,6 +177,97 @@
             }
           },
           "resources": {
+            "channels": {
+              "methods": {
+                "getIamPolicy": {
+                  "description": "Gets the access control policy for a resource. Returns an empty policy if the resource exists and does not have a policy set.",
+                  "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:getIamPolicy",
+                  "httpMethod": "GET",
+                  "id": "eventarc.projects.locations.channels.getIamPolicy",
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "parameters": {
+                    "options.requestedPolicyVersion": {
+                      "description": "Optional. The policy format version to be returned. Valid values are 0, 1, and 3. Requests specifying an invalid value will be rejected. Requests for policies with any conditional bindings must specify version 3. Policies without any conditional bindings may specify any valid value or leave the field unset. To learn which resources support conditions in their IAM policies, see the [IAM documentation](https://cloud.google.com/iam/help/conditions/resource-policies).",
+                      "format": "int32",
+                      "location": "query",
+                      "type": "integer"
+                    },
+                    "resource": {
+                      "description": "REQUIRED: The resource for which the policy is being requested. See the operation documentation for the appropriate value for this field.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/channels/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v1/{+resource}:getIamPolicy",
+                  "response": {
+                    "$ref": "Policy"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
+                "setIamPolicy": {
+                  "description": "Sets the access control policy on the specified resource. Replaces any existing policy. Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors.",
+                  "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:setIamPolicy",
+                  "httpMethod": "POST",
+                  "id": "eventarc.projects.locations.channels.setIamPolicy",
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "parameters": {
+                    "resource": {
+                      "description": "REQUIRED: The resource for which the policy is being specified. See the operation documentation for the appropriate value for this field.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/channels/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v1/{+resource}:setIamPolicy",
+                  "request": {
+                    "$ref": "SetIamPolicyRequest"
+                  },
+                  "response": {
+                    "$ref": "Policy"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
+                "testIamPermissions": {
+                  "description": "Returns permissions that a caller has on the specified resource. If the resource does not exist, this will return an empty set of permissions, not a `NOT_FOUND` error. Note: This operation is designed to be used for building permission-aware UIs and command-line tools, not for authorization checking. This operation may \"fail open\" without warning.",
+                  "flatPath": "v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:testIamPermissions",
+                  "httpMethod": "POST",
+                  "id": "eventarc.projects.locations.channels.testIamPermissions",
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "parameters": {
+                    "resource": {
+                      "description": "REQUIRED: The resource for which the policy detail is being requested. See the operation documentation for the appropriate value for this field.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/channels/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v1/{+resource}:testIamPermissions",
+                  "request": {
+                    "$ref": "TestIamPermissionsRequest"
+                  },
+                  "response": {
+                    "$ref": "TestIamPermissionsResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                }
+              }
+            },
             "operations": {
               "methods": {
                 "cancel": {
@@ -584,7 +675,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210723",
   "rootUrl": "https://eventarc.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/eventarc.v1beta1.json b/googleapiclient/discovery_cache/documents/eventarc.v1beta1.json
index e5f25d5..8718e60 100644
--- a/googleapiclient/discovery_cache/documents/eventarc.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/eventarc.v1beta1.json
@@ -584,7 +584,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://eventarc.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/factchecktools.v1alpha1.json b/googleapiclient/discovery_cache/documents/factchecktools.v1alpha1.json
index f85b387..ba83ae7 100644
--- a/googleapiclient/discovery_cache/documents/factchecktools.v1alpha1.json
+++ b/googleapiclient/discovery_cache/documents/factchecktools.v1alpha1.json
@@ -304,7 +304,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://factchecktools.googleapis.com/",
   "schemas": {
     "GoogleFactcheckingFactchecktoolsV1alpha1Claim": {
diff --git a/googleapiclient/discovery_cache/documents/fcm.v1.json b/googleapiclient/discovery_cache/documents/fcm.v1.json
index e96082a..99054e1 100644
--- a/googleapiclient/discovery_cache/documents/fcm.v1.json
+++ b/googleapiclient/discovery_cache/documents/fcm.v1.json
@@ -142,7 +142,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210719",
   "rootUrl": "https://fcm.googleapis.com/",
   "schemas": {
     "AndroidConfig": {
diff --git a/googleapiclient/discovery_cache/documents/fcmdata.v1beta1.json b/googleapiclient/discovery_cache/documents/fcmdata.v1beta1.json
index 7a54abd..c957487 100644
--- a/googleapiclient/discovery_cache/documents/fcmdata.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/fcmdata.v1beta1.json
@@ -154,7 +154,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://fcmdata.googleapis.com/",
   "schemas": {
     "GoogleFirebaseFcmDataV1beta1AndroidDeliveryData": {
diff --git a/googleapiclient/discovery_cache/documents/file.v1beta1.json b/googleapiclient/discovery_cache/documents/file.v1beta1.json
index bf9f202..34e8bd7 100644
--- a/googleapiclient/discovery_cache/documents/file.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/file.v1beta1.json
@@ -542,6 +542,175 @@
                     "https://www.googleapis.com/auth/cloud-platform"
                   ]
                 }
+              },
+              "resources": {
+                "snapshots": {
+                  "methods": {
+                    "create": {
+                      "description": "Creates a snapshot.",
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots",
+                      "httpMethod": "POST",
+                      "id": "file.projects.locations.instances.snapshots.create",
+                      "parameterOrder": [
+                        "parent"
+                      ],
+                      "parameters": {
+                        "parent": {
+                          "description": "Required. The Filestore Instance to create the snapshots of, in the format projects/{project_id}/locations/{location}/instances/{instance_id}",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/instances/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        },
+                        "snapshotId": {
+                          "description": "Required. The ID to use for the snapshot. The ID must be unique within the specified instance. This value must start with a lowercase letter followed by up to 62 lowercase letters, numbers, or hyphens, and cannot end with a hyphen.",
+                          "location": "query",
+                          "type": "string"
+                        }
+                      },
+                      "path": "v1beta1/{+parent}/snapshots",
+                      "request": {
+                        "$ref": "Snapshot"
+                      },
+                      "response": {
+                        "$ref": "Operation"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
+                    },
+                    "delete": {
+                      "description": "Deletes a snapshot.",
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}",
+                      "httpMethod": "DELETE",
+                      "id": "file.projects.locations.instances.snapshots.delete",
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "parameters": {
+                        "name": {
+                          "description": "Required. The snapshot resource name, in the format projects/{project_id}/locations/{location}/instances/{instance_id}/snapshots/{snapshot_id}",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/instances/[^/]+/snapshots/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v1beta1/{+name}",
+                      "response": {
+                        "$ref": "Operation"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
+                    },
+                    "get": {
+                      "description": "Gets the details of a specific snapshot.",
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}",
+                      "httpMethod": "GET",
+                      "id": "file.projects.locations.instances.snapshots.get",
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "parameters": {
+                        "name": {
+                          "description": "Required. The snapshot resource name, in the format projects/{project_id}/locations/{location}/instances/{instance_id}/snapshots/{snapshot_id}",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/instances/[^/]+/snapshots/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v1beta1/{+name}",
+                      "response": {
+                        "$ref": "Snapshot"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
+                    },
+                    "list": {
+                      "description": "Lists all snapshots in a project for either a specified location or for all locations.",
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots",
+                      "httpMethod": "GET",
+                      "id": "file.projects.locations.instances.snapshots.list",
+                      "parameterOrder": [
+                        "parent"
+                      ],
+                      "parameters": {
+                        "filter": {
+                          "description": "List filter.",
+                          "location": "query",
+                          "type": "string"
+                        },
+                        "orderBy": {
+                          "description": "Sort results. Supported values are \"name\", \"name desc\" or \"\" (unsorted).",
+                          "location": "query",
+                          "type": "string"
+                        },
+                        "pageSize": {
+                          "description": "The maximum number of items to return.",
+                          "format": "int32",
+                          "location": "query",
+                          "type": "integer"
+                        },
+                        "pageToken": {
+                          "description": "The next_page_token value to use if there are additional results to retrieve for this list request.",
+                          "location": "query",
+                          "type": "string"
+                        },
+                        "parent": {
+                          "description": "Required. The instance for which to retrieve snapshot information, in the format projects/{project_id}/locations/{location}/instances/{instance_id}.",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/instances/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v1beta1/{+parent}/snapshots",
+                      "response": {
+                        "$ref": "ListSnapshotsResponse"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
+                    },
+                    "patch": {
+                      "description": "Updates the settings of a specific snapshot.",
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}",
+                      "httpMethod": "PATCH",
+                      "id": "file.projects.locations.instances.snapshots.patch",
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "parameters": {
+                        "name": {
+                          "description": "Output only. The resource name of the snapshot, in the format projects/{project_id}/locations/{location_id}/instances/{instance_id}/snapshots/{snapshot_id}.",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/instances/[^/]+/snapshots/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        },
+                        "updateMask": {
+                          "description": "Required. Mask of fields to update. At least one path must be supplied in this field.",
+                          "format": "google-fieldmask",
+                          "location": "query",
+                          "type": "string"
+                        }
+                      },
+                      "path": "v1beta1/{+name}",
+                      "request": {
+                        "$ref": "Snapshot"
+                      },
+                      "response": {
+                        "$ref": "Operation"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
+                    }
+                  }
+                }
               }
             },
             "operations": {
@@ -672,7 +841,7 @@
       }
     }
   },
-  "revision": "20210708",
+  "revision": "20210721",
   "rootUrl": "https://file.googleapis.com/",
   "schemas": {
     "Backup": {
@@ -1348,6 +1517,24 @@
       },
       "type": "object"
     },
+    "ListSnapshotsResponse": {
+      "description": "ListSnapshotsResponse is the result of ListSnapshotsRequest.",
+      "id": "ListSnapshotsResponse",
+      "properties": {
+        "nextPageToken": {
+          "description": "The token you can use to retrieve the next page of results. Not returned if there are no more results in the list.",
+          "type": "string"
+        },
+        "snapshots": {
+          "description": "A list of snapshots in the project for the specified instance.",
+          "items": {
+            "$ref": "Snapshot"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "Location": {
       "description": "A resource that represents Google Cloud Platform location.",
       "id": "Location",
@@ -1493,7 +1680,7 @@
           "type": "string"
         },
         "reservedIpRange": {
-          "description": "A /29 CIDR block for Basic or a /23 CIDR block for High Scale in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can't overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.",
+          "description": "Optional, reserved_ip_range can have one of the following two types of values. * CIDR range value when using DIRECT_PEERING connect mode. * [Named Address Range](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address) when using PRIVATE_SERVICE_ACCESS connect mode. For both cases, the range value (direct CIDR value or the range value with which the named range was created) must be a /29 CIDR block for Basic tier or a /23 CIDR block for High Scale or Enterprise tier in one of the [internal IP address ranges](https://www.arin.net/knowledge/address_filters.html) that identifies the range of IP addresses reserved for this instance. For example, 10.0.0.0/29 or 192.168.0.0/23. The range you specify can't overlap with either existing subnets or assigned IP address ranges for other Cloud Filestore instances in the selected VPC network.",
           "type": "string"
         }
       },
@@ -1689,6 +1876,58 @@
       },
       "type": "object"
     },
+    "Snapshot": {
+      "description": "A Cloud Filestore snapshot.",
+      "id": "Snapshot",
+      "properties": {
+        "createTime": {
+          "description": "Output only. The time when the snapshot was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "description": {
+          "description": "A description of the snapshot with 2048 characters or less. Requests with longer descriptions will be rejected.",
+          "type": "string"
+        },
+        "filesystemUsedBytes": {
+          "description": "Output only. The amount of bytes needed to allocate a full copy of the snapshot content",
+          "format": "int64",
+          "readOnly": true,
+          "type": "string"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Resource labels to represent user provided metadata.",
+          "type": "object"
+        },
+        "name": {
+          "description": "Output only. The resource name of the snapshot, in the format projects/{project_id}/locations/{location_id}/instances/{instance_id}/snapshots/{snapshot_id}.",
+          "readOnly": true,
+          "type": "string"
+        },
+        "state": {
+          "description": "Output only. The snapshot state.",
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "CREATING",
+            "READY",
+            "DELETING"
+          ],
+          "enumDescriptions": [
+            "State not set.",
+            "Snapshot is being created.",
+            "Snapshot is available for use.",
+            "Snapshot is being deleted."
+          ],
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "Status": {
       "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).",
       "id": "Status",
@@ -1762,7 +2001,7 @@
           "type": "string"
         },
         "denyMaintenancePeriods": {
-          "description": "Deny Maintenance Period that is applied to resource to indicate when maintenance is forbidden. User can specify zero or more non-overlapping deny periods. For V1, Maximum number of deny_maintenance_periods is expected to be one.",
+          "description": "Deny Maintenance Period that is applied to resource to indicate when maintenance is forbidden. User can specify zero or more non-overlapping deny periods. Maximum number of deny_maintenance_periods expected is one.",
           "items": {
             "$ref": "DenyMaintenancePeriod"
           },
diff --git a/googleapiclient/discovery_cache/documents/firebase.v1beta1.json b/googleapiclient/discovery_cache/documents/firebase.v1beta1.json
index e6f82b4..3138b48 100644
--- a/googleapiclient/discovery_cache/documents/firebase.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/firebase.v1beta1.json
@@ -1121,7 +1121,7 @@
       }
     }
   },
-  "revision": "20210716",
+  "revision": "20210723",
   "rootUrl": "https://firebase.googleapis.com/",
   "schemas": {
     "AddFirebaseRequest": {
diff --git a/googleapiclient/discovery_cache/documents/firebaseappcheck.v1beta.json b/googleapiclient/discovery_cache/documents/firebaseappcheck.v1beta.json
index 882260e..91f8f00 100644
--- a/googleapiclient/discovery_cache/documents/firebaseappcheck.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/firebaseappcheck.v1beta.json
@@ -1057,7 +1057,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210716",
   "rootUrl": "https://firebaseappcheck.googleapis.com/",
   "schemas": {
     "GoogleFirebaseAppcheckV1betaAppAttestChallengeResponse": {
diff --git a/googleapiclient/discovery_cache/documents/firebasedatabase.v1beta.json b/googleapiclient/discovery_cache/documents/firebasedatabase.v1beta.json
index c661141..d1a7348 100644
--- a/googleapiclient/discovery_cache/documents/firebasedatabase.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/firebasedatabase.v1beta.json
@@ -317,7 +317,7 @@
       }
     }
   },
-  "revision": "20210716",
+  "revision": "20210723",
   "rootUrl": "https://firebasedatabase.googleapis.com/",
   "schemas": {
     "DatabaseInstance": {
diff --git a/googleapiclient/discovery_cache/documents/firebasedynamiclinks.v1.json b/googleapiclient/discovery_cache/documents/firebasedynamiclinks.v1.json
index fb1a349..8e4b8f8 100644
--- a/googleapiclient/discovery_cache/documents/firebasedynamiclinks.v1.json
+++ b/googleapiclient/discovery_cache/documents/firebasedynamiclinks.v1.json
@@ -224,7 +224,7 @@
       }
     }
   },
-  "revision": "20210715",
+  "revision": "20210719",
   "rootUrl": "https://firebasedynamiclinks.googleapis.com/",
   "schemas": {
     "AnalyticsInfo": {
diff --git a/googleapiclient/discovery_cache/documents/firebasehosting.v1.json b/googleapiclient/discovery_cache/documents/firebasehosting.v1.json
index 21fc118..0d94e9b 100644
--- a/googleapiclient/discovery_cache/documents/firebasehosting.v1.json
+++ b/googleapiclient/discovery_cache/documents/firebasehosting.v1.json
@@ -186,7 +186,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210720",
   "rootUrl": "https://firebasehosting.googleapis.com/",
   "schemas": {
     "CancelOperationRequest": {
diff --git a/googleapiclient/discovery_cache/documents/firebasehosting.v1beta1.json b/googleapiclient/discovery_cache/documents/firebasehosting.v1beta1.json
index 3c126da..31fbade 100644
--- a/googleapiclient/discovery_cache/documents/firebasehosting.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/firebasehosting.v1beta1.json
@@ -1939,7 +1939,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210720",
   "rootUrl": "https://firebasehosting.googleapis.com/",
   "schemas": {
     "ActingUser": {
diff --git a/googleapiclient/discovery_cache/documents/firebaseml.v1.json b/googleapiclient/discovery_cache/documents/firebaseml.v1.json
index 3f854b3..25483c3 100644
--- a/googleapiclient/discovery_cache/documents/firebaseml.v1.json
+++ b/googleapiclient/discovery_cache/documents/firebaseml.v1.json
@@ -204,7 +204,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210721",
   "rootUrl": "https://firebaseml.googleapis.com/",
   "schemas": {
     "CancelOperationRequest": {
diff --git a/googleapiclient/discovery_cache/documents/firebaseml.v1beta2.json b/googleapiclient/discovery_cache/documents/firebaseml.v1beta2.json
index 76b6deb..6576d36 100644
--- a/googleapiclient/discovery_cache/documents/firebaseml.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/firebaseml.v1beta2.json
@@ -318,7 +318,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210721",
   "rootUrl": "https://firebaseml.googleapis.com/",
   "schemas": {
     "DownloadModelResponse": {
diff --git a/googleapiclient/discovery_cache/documents/firebasestorage.v1beta.json b/googleapiclient/discovery_cache/documents/firebasestorage.v1beta.json
index a5bb7be..8964d5f 100644
--- a/googleapiclient/discovery_cache/documents/firebasestorage.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/firebasestorage.v1beta.json
@@ -238,7 +238,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://firebasestorage.googleapis.com/",
   "schemas": {
     "AddFirebaseRequest": {
diff --git a/googleapiclient/discovery_cache/documents/fitness.v1.json b/googleapiclient/discovery_cache/documents/fitness.v1.json
index 033a7a9..a088476 100644
--- a/googleapiclient/discovery_cache/documents/fitness.v1.json
+++ b/googleapiclient/discovery_cache/documents/fitness.v1.json
@@ -831,7 +831,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210721",
   "rootUrl": "https://fitness.googleapis.com/",
   "schemas": {
     "AggregateBucket": {
diff --git a/googleapiclient/discovery_cache/documents/games.v1.json b/googleapiclient/discovery_cache/documents/games.v1.json
index 02fa99f..bfef6a4 100644
--- a/googleapiclient/discovery_cache/documents/games.v1.json
+++ b/googleapiclient/discovery_cache/documents/games.v1.json
@@ -1224,7 +1224,7 @@
       }
     }
   },
-  "revision": "20210719",
+  "revision": "20210721",
   "rootUrl": "https://games.googleapis.com/",
   "schemas": {
     "AchievementDefinition": {
diff --git a/googleapiclient/discovery_cache/documents/gamesConfiguration.v1configuration.json b/googleapiclient/discovery_cache/documents/gamesConfiguration.v1configuration.json
index a8350c9..6fce94c 100644
--- a/googleapiclient/discovery_cache/documents/gamesConfiguration.v1configuration.json
+++ b/googleapiclient/discovery_cache/documents/gamesConfiguration.v1configuration.json
@@ -439,7 +439,7 @@
       }
     }
   },
-  "revision": "20210719",
+  "revision": "20210721",
   "rootUrl": "https://gamesconfiguration.googleapis.com/",
   "schemas": {
     "AchievementConfiguration": {
diff --git a/googleapiclient/discovery_cache/documents/gamesManagement.v1management.json b/googleapiclient/discovery_cache/documents/gamesManagement.v1management.json
index dabd356..c252dc0 100644
--- a/googleapiclient/discovery_cache/documents/gamesManagement.v1management.json
+++ b/googleapiclient/discovery_cache/documents/gamesManagement.v1management.json
@@ -471,7 +471,7 @@
       }
     }
   },
-  "revision": "20210719",
+  "revision": "20210721",
   "rootUrl": "https://gamesmanagement.googleapis.com/",
   "schemas": {
     "AchievementResetAllResponse": {
diff --git a/googleapiclient/discovery_cache/documents/gameservices.v1beta.json b/googleapiclient/discovery_cache/documents/gameservices.v1beta.json
index e972b8c..5153409 100644
--- a/googleapiclient/discovery_cache/documents/gameservices.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/gameservices.v1beta.json
@@ -1357,7 +1357,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210714",
   "rootUrl": "https://gameservices.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/genomics.v2alpha1.json b/googleapiclient/discovery_cache/documents/genomics.v2alpha1.json
index 4839b33..0b8eb11 100644
--- a/googleapiclient/discovery_cache/documents/genomics.v2alpha1.json
+++ b/googleapiclient/discovery_cache/documents/genomics.v2alpha1.json
@@ -301,7 +301,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210720",
   "rootUrl": "https://genomics.googleapis.com/",
   "schemas": {
     "Accelerator": {
diff --git a/googleapiclient/discovery_cache/documents/gkehub.v1.json b/googleapiclient/discovery_cache/documents/gkehub.v1.json
index a8fc993..01aa654 100644
--- a/googleapiclient/discovery_cache/documents/gkehub.v1.json
+++ b/googleapiclient/discovery_cache/documents/gkehub.v1.json
@@ -905,7 +905,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://gkehub.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/gkehub.v1alpha.json b/googleapiclient/discovery_cache/documents/gkehub.v1alpha.json
index 436c97b..14fc11c 100644
--- a/googleapiclient/discovery_cache/documents/gkehub.v1alpha.json
+++ b/googleapiclient/discovery_cache/documents/gkehub.v1alpha.json
@@ -670,7 +670,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210723",
   "rootUrl": "https://gkehub.googleapis.com/",
   "schemas": {
     "AuditConfig": {
diff --git a/googleapiclient/discovery_cache/documents/gmail.v1.json b/googleapiclient/discovery_cache/documents/gmail.v1.json
index 0bc5225..6868bb4 100644
--- a/googleapiclient/discovery_cache/documents/gmail.v1.json
+++ b/googleapiclient/discovery_cache/documents/gmail.v1.json
@@ -2682,7 +2682,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210719",
   "rootUrl": "https://gmail.googleapis.com/",
   "schemas": {
     "AutoForwarding": {
diff --git a/googleapiclient/discovery_cache/documents/gmailpostmastertools.v1.json b/googleapiclient/discovery_cache/documents/gmailpostmastertools.v1.json
index 5d1a44a..0882d62 100644
--- a/googleapiclient/discovery_cache/documents/gmailpostmastertools.v1.json
+++ b/googleapiclient/discovery_cache/documents/gmailpostmastertools.v1.json
@@ -265,7 +265,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://gmailpostmastertools.googleapis.com/",
   "schemas": {
     "DeliveryError": {
diff --git a/googleapiclient/discovery_cache/documents/gmailpostmastertools.v1beta1.json b/googleapiclient/discovery_cache/documents/gmailpostmastertools.v1beta1.json
index d2d053f..78428cc 100644
--- a/googleapiclient/discovery_cache/documents/gmailpostmastertools.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/gmailpostmastertools.v1beta1.json
@@ -265,7 +265,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://gmailpostmastertools.googleapis.com/",
   "schemas": {
     "DeliveryError": {
diff --git a/googleapiclient/discovery_cache/documents/groupsmigration.v1.json b/googleapiclient/discovery_cache/documents/groupsmigration.v1.json
index 0131560..a637a09 100644
--- a/googleapiclient/discovery_cache/documents/groupsmigration.v1.json
+++ b/googleapiclient/discovery_cache/documents/groupsmigration.v1.json
@@ -146,7 +146,7 @@
       }
     }
   },
-  "revision": "20210708",
+  "revision": "20210715",
   "rootUrl": "https://groupsmigration.googleapis.com/",
   "schemas": {
     "Groups": {
diff --git a/googleapiclient/discovery_cache/documents/groupssettings.v1.json b/googleapiclient/discovery_cache/documents/groupssettings.v1.json
index 3ab2cc9..e5fc517 100644
--- a/googleapiclient/discovery_cache/documents/groupssettings.v1.json
+++ b/googleapiclient/discovery_cache/documents/groupssettings.v1.json
@@ -152,7 +152,7 @@
       }
     }
   },
-  "revision": "20210708",
+  "revision": "20210715",
   "rootUrl": "https://www.googleapis.com/",
   "schemas": {
     "Groups": {
diff --git a/googleapiclient/discovery_cache/documents/healthcare.v1.json b/googleapiclient/discovery_cache/documents/healthcare.v1.json
index 678192e..76a184c 100644
--- a/googleapiclient/discovery_cache/documents/healthcare.v1.json
+++ b/googleapiclient/discovery_cache/documents/healthcare.v1.json
@@ -3920,7 +3920,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210715",
   "rootUrl": "https://healthcare.googleapis.com/",
   "schemas": {
     "ActivateConsentRequest": {
diff --git a/googleapiclient/discovery_cache/documents/healthcare.v1beta1.json b/googleapiclient/discovery_cache/documents/healthcare.v1beta1.json
index 83a718d..cb66b86 100644
--- a/googleapiclient/discovery_cache/documents/healthcare.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/healthcare.v1beta1.json
@@ -4829,7 +4829,7 @@
                 "nlp": {
                   "methods": {
                     "analyzeEntities": {
-                      "description": "Analyze heathcare entity in a document. Its response includes the recognized entity mentions and the relationships between them. AnalyzeEntities uses context aware models to detect entities.",
+                      "description": "Analyze heathcare entity in a document. Its response includes the recognized entity mentions and the relationships between them. AnalyzeEntities uses context aware models to detect entities. This method can only analyze documents written in English.",
                       "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/services/nlp:analyzeEntities",
                       "httpMethod": "POST",
                       "id": "healthcare.projects.locations.services.nlp.analyzeEntities",
@@ -4865,7 +4865,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210715",
   "rootUrl": "https://healthcare.googleapis.com/",
   "schemas": {
     "ActivateConsentRequest": {
diff --git a/googleapiclient/discovery_cache/documents/homegraph.v1.json b/googleapiclient/discovery_cache/documents/homegraph.v1.json
index 892a5de..b25d5d2 100644
--- a/googleapiclient/discovery_cache/documents/homegraph.v1.json
+++ b/googleapiclient/discovery_cache/documents/homegraph.v1.json
@@ -216,7 +216,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://homegraph.googleapis.com/",
   "schemas": {
     "AgentDeviceId": {
diff --git a/googleapiclient/discovery_cache/documents/iam.v1.json b/googleapiclient/discovery_cache/documents/iam.v1.json
index 612c5d0..fe57b81 100644
--- a/googleapiclient/discovery_cache/documents/iam.v1.json
+++ b/googleapiclient/discovery_cache/documents/iam.v1.json
@@ -1696,7 +1696,7 @@
       }
     }
   },
-  "revision": "20210623",
+  "revision": "20210714",
   "rootUrl": "https://iam.googleapis.com/",
   "schemas": {
     "AdminAuditData": {
diff --git a/googleapiclient/discovery_cache/documents/iamcredentials.v1.json b/googleapiclient/discovery_cache/documents/iamcredentials.v1.json
index cf9bebc..b4c5679 100644
--- a/googleapiclient/discovery_cache/documents/iamcredentials.v1.json
+++ b/googleapiclient/discovery_cache/documents/iamcredentials.v1.json
@@ -226,7 +226,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://iamcredentials.googleapis.com/",
   "schemas": {
     "GenerateAccessTokenRequest": {
diff --git a/googleapiclient/discovery_cache/documents/iap.v1.json b/googleapiclient/discovery_cache/documents/iap.v1.json
index 736565d..801146d 100644
--- a/googleapiclient/discovery_cache/documents/iap.v1.json
+++ b/googleapiclient/discovery_cache/documents/iap.v1.json
@@ -487,7 +487,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://iap.googleapis.com/",
   "schemas": {
     "AccessDeniedPageSettings": {
diff --git a/googleapiclient/discovery_cache/documents/iap.v1beta1.json b/googleapiclient/discovery_cache/documents/iap.v1beta1.json
index bf97f95..f0823b8 100644
--- a/googleapiclient/discovery_cache/documents/iap.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/iap.v1beta1.json
@@ -194,7 +194,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://iap.googleapis.com/",
   "schemas": {
     "Binding": {
diff --git a/googleapiclient/discovery_cache/documents/ideahub.v1alpha.json b/googleapiclient/discovery_cache/documents/ideahub.v1alpha.json
index 39dfb5c..5fb85ea 100644
--- a/googleapiclient/discovery_cache/documents/ideahub.v1alpha.json
+++ b/googleapiclient/discovery_cache/documents/ideahub.v1alpha.json
@@ -371,7 +371,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://ideahub.googleapis.com/",
   "schemas": {
     "GoogleSearchIdeahubV1alphaAvailableLocale": {
diff --git a/googleapiclient/discovery_cache/documents/keep.v1.json b/googleapiclient/discovery_cache/documents/keep.v1.json
index c0422a2..13701ea 100644
--- a/googleapiclient/discovery_cache/documents/keep.v1.json
+++ b/googleapiclient/discovery_cache/documents/keep.v1.json
@@ -314,7 +314,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210720",
   "rootUrl": "https://keep.googleapis.com/",
   "schemas": {
     "Attachment": {
diff --git a/googleapiclient/discovery_cache/documents/language.v1.json b/googleapiclient/discovery_cache/documents/language.v1.json
index b399c21..35f1bcc 100644
--- a/googleapiclient/discovery_cache/documents/language.v1.json
+++ b/googleapiclient/discovery_cache/documents/language.v1.json
@@ -227,7 +227,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://language.googleapis.com/",
   "schemas": {
     "AnalyzeEntitiesRequest": {
diff --git a/googleapiclient/discovery_cache/documents/language.v1beta1.json b/googleapiclient/discovery_cache/documents/language.v1beta1.json
index 2955e57..df36603 100644
--- a/googleapiclient/discovery_cache/documents/language.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/language.v1beta1.json
@@ -189,7 +189,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://language.googleapis.com/",
   "schemas": {
     "AnalyzeEntitiesRequest": {
diff --git a/googleapiclient/discovery_cache/documents/language.v1beta2.json b/googleapiclient/discovery_cache/documents/language.v1beta2.json
index 45ddfa1..8186e53 100644
--- a/googleapiclient/discovery_cache/documents/language.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/language.v1beta2.json
@@ -227,7 +227,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://language.googleapis.com/",
   "schemas": {
     "AnalyzeEntitiesRequest": {
diff --git a/googleapiclient/discovery_cache/documents/libraryagent.v1.json b/googleapiclient/discovery_cache/documents/libraryagent.v1.json
index 09bb92a..7844635 100644
--- a/googleapiclient/discovery_cache/documents/libraryagent.v1.json
+++ b/googleapiclient/discovery_cache/documents/libraryagent.v1.json
@@ -279,7 +279,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://libraryagent.googleapis.com/",
   "schemas": {
     "GoogleExampleLibraryagentV1Book": {
diff --git a/googleapiclient/discovery_cache/documents/localservices.v1.json b/googleapiclient/discovery_cache/documents/localservices.v1.json
index 9fa3eed..1f005bf 100644
--- a/googleapiclient/discovery_cache/documents/localservices.v1.json
+++ b/googleapiclient/discovery_cache/documents/localservices.v1.json
@@ -250,7 +250,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://localservices.googleapis.com/",
   "schemas": {
     "GoogleAdsHomeservicesLocalservicesV1AccountReport": {
diff --git a/googleapiclient/discovery_cache/documents/logging.v2.json b/googleapiclient/discovery_cache/documents/logging.v2.json
index af31f22..aaf3245 100644
--- a/googleapiclient/discovery_cache/documents/logging.v2.json
+++ b/googleapiclient/discovery_cache/documents/logging.v2.json
@@ -5482,7 +5482,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210714",
   "rootUrl": "https://logging.googleapis.com/",
   "schemas": {
     "BigQueryOptions": {
diff --git a/googleapiclient/discovery_cache/documents/manufacturers.v1.json b/googleapiclient/discovery_cache/documents/manufacturers.v1.json
index f4f3a43..e62e66b 100644
--- a/googleapiclient/discovery_cache/documents/manufacturers.v1.json
+++ b/googleapiclient/discovery_cache/documents/manufacturers.v1.json
@@ -287,7 +287,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210721",
   "rootUrl": "https://manufacturers.googleapis.com/",
   "schemas": {
     "Attributes": {
diff --git a/googleapiclient/discovery_cache/documents/metastore.v1alpha.json b/googleapiclient/discovery_cache/documents/metastore.v1alpha.json
index f4f551d..a0e9c9a 100644
--- a/googleapiclient/discovery_cache/documents/metastore.v1alpha.json
+++ b/googleapiclient/discovery_cache/documents/metastore.v1alpha.json
@@ -986,7 +986,7 @@
       }
     }
   },
-  "revision": "20210702",
+  "revision": "20210715",
   "rootUrl": "https://metastore.googleapis.com/",
   "schemas": {
     "AuditConfig": {
@@ -1073,14 +1073,16 @@
             "CREATING",
             "DELETING",
             "ACTIVE",
-            "FAILED"
+            "FAILED",
+            "RESTORING"
           ],
           "enumDescriptions": [
             "The state of the backup is unknown.",
             "The backup is being created.",
             "The backup is being deleted.",
             "The backup is active and ready to use.",
-            "The backup failed."
+            "The backup failed.",
+            "The backup is being restored."
           ],
           "readOnly": true,
           "type": "string"
diff --git a/googleapiclient/discovery_cache/documents/metastore.v1beta.json b/googleapiclient/discovery_cache/documents/metastore.v1beta.json
index 4df5cec..39018e9 100644
--- a/googleapiclient/discovery_cache/documents/metastore.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/metastore.v1beta.json
@@ -986,7 +986,7 @@
       }
     }
   },
-  "revision": "20210702",
+  "revision": "20210715",
   "rootUrl": "https://metastore.googleapis.com/",
   "schemas": {
     "AuditConfig": {
@@ -1073,14 +1073,16 @@
             "CREATING",
             "DELETING",
             "ACTIVE",
-            "FAILED"
+            "FAILED",
+            "RESTORING"
           ],
           "enumDescriptions": [
             "The state of the backup is unknown.",
             "The backup is being created.",
             "The backup is being deleted.",
             "The backup is active and ready to use.",
-            "The backup failed."
+            "The backup failed.",
+            "The backup is being restored."
           ],
           "readOnly": true,
           "type": "string"
diff --git a/googleapiclient/discovery_cache/documents/ml.v1.json b/googleapiclient/discovery_cache/documents/ml.v1.json
index 03ce4da..7d73a39 100644
--- a/googleapiclient/discovery_cache/documents/ml.v1.json
+++ b/googleapiclient/discovery_cache/documents/ml.v1.json
@@ -1486,7 +1486,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210720",
   "rootUrl": "https://ml.googleapis.com/",
   "schemas": {
     "GoogleApi__HttpBody": {
diff --git a/googleapiclient/discovery_cache/documents/monitoring.v1.json b/googleapiclient/discovery_cache/documents/monitoring.v1.json
index b748645..b66e4d6 100644
--- a/googleapiclient/discovery_cache/documents/monitoring.v1.json
+++ b/googleapiclient/discovery_cache/documents/monitoring.v1.json
@@ -114,6 +114,131 @@
   },
   "protocol": "rest",
   "resources": {
+    "locations": {
+      "resources": {
+        "global": {
+          "resources": {
+            "metricsScopes": {
+              "methods": {
+                "get": {
+                  "description": "Returns a specific Metrics Scope.",
+                  "flatPath": "v1/locations/global/metricsScopes/{metricsScopesId}",
+                  "httpMethod": "GET",
+                  "id": "monitoring.locations.global.metricsScopes.get",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "description": "Required. The resource name of the Metrics Scope. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}",
+                      "location": "path",
+                      "pattern": "^locations/global/metricsScopes/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v1/{+name}",
+                  "response": {
+                    "$ref": "MetricsScope"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/monitoring",
+                    "https://www.googleapis.com/auth/monitoring.read"
+                  ]
+                },
+                "listMetricScopesByMonitoredProject": {
+                  "description": "Returns a list of every Metrics Scope that a specific MonitoredProject has been added to. The metrics scope representing the specified monitored project will always be the first entry in the response.",
+                  "flatPath": "v1/locations/global/metricsScopes:listMetricScopesByMonitoredProject",
+                  "httpMethod": "GET",
+                  "id": "monitoring.locations.global.metricsScopes.listMetricScopesByMonitoredProject",
+                  "parameterOrder": [],
+                  "parameters": {
+                    "monitoredResourceContainer": {
+                      "description": "Required. The resource name of the Monitored Project being requested. Example: projects/{MONITORED_PROJECT_ID_OR_NUMBER}",
+                      "location": "query",
+                      "type": "string"
+                    }
+                  },
+                  "path": "v1/locations/global/metricsScopes:listMetricScopesByMonitoredProject",
+                  "response": {
+                    "$ref": "ListMetricsScopesByMonitoredProjectResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/monitoring",
+                    "https://www.googleapis.com/auth/monitoring.read"
+                  ]
+                }
+              },
+              "resources": {
+                "projects": {
+                  "methods": {
+                    "create": {
+                      "description": "Adds a MonitoredProject with the given project ID to the specified Metrics Scope.",
+                      "flatPath": "v1/locations/global/metricsScopes/{metricsScopesId}/projects",
+                      "httpMethod": "POST",
+                      "id": "monitoring.locations.global.metricsScopes.projects.create",
+                      "parameterOrder": [
+                        "parent"
+                      ],
+                      "parameters": {
+                        "parent": {
+                          "description": "Required. The resource name of the existing Metrics Scope that will monitor this project. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}",
+                          "location": "path",
+                          "pattern": "^locations/global/metricsScopes/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v1/{+parent}/projects",
+                      "request": {
+                        "$ref": "MonitoredProject"
+                      },
+                      "response": {
+                        "$ref": "Operation"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/monitoring",
+                        "https://www.googleapis.com/auth/monitoring.write"
+                      ]
+                    },
+                    "delete": {
+                      "description": "Deletes a MonitoredProject from the specified Metrics Scope.",
+                      "flatPath": "v1/locations/global/metricsScopes/{metricsScopesId}/projects/{projectsId}",
+                      "httpMethod": "DELETE",
+                      "id": "monitoring.locations.global.metricsScopes.projects.delete",
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "parameters": {
+                        "name": {
+                          "description": "Required. The resource name of the MonitoredProject. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}/projects/{MONITORED_PROJECT_ID_OR_NUMBER}Authorization requires the following Google IAM (https://cloud.google.com/iam) permissions on both the Metrics Scope and on the MonitoredProject: monitoring.metricsScopes.link",
+                          "location": "path",
+                          "pattern": "^locations/global/metricsScopes/[^/]+/projects/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v1/{+name}",
+                      "response": {
+                        "$ref": "Operation"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/monitoring",
+                        "https://www.googleapis.com/auth/monitoring.write"
+                      ]
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    },
     "operations": {
       "methods": {
         "get": {
@@ -316,7 +441,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210720",
   "rootUrl": "https://monitoring.googleapis.com/",
   "schemas": {
     "Aggregation": {
@@ -765,6 +890,68 @@
       },
       "type": "object"
     },
+    "ListMetricsScopesByMonitoredProjectResponse": {
+      "description": "Response for the ListMetricsScopesByMonitoredProject method.",
+      "id": "ListMetricsScopesByMonitoredProjectResponse",
+      "properties": {
+        "metricsScopes": {
+          "description": "A set of all metrics scopes that the specified monitored project has been added to.",
+          "items": {
+            "$ref": "MetricsScope"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "MetricsScope": {
+      "description": "Represents a Metrics Scope (https://cloud.google.com/monitoring/settings#concept-scope) in Cloud Monitoring, which specifies one or more Google projects and zero or more AWS accounts to monitor together.",
+      "id": "MetricsScope",
+      "properties": {
+        "createTime": {
+          "description": "Output only. The time when this Metrics Scope was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "monitoredProjects": {
+          "description": "Output only. The list of projects monitored by this Metrics Scope.",
+          "items": {
+            "$ref": "MonitoredProject"
+          },
+          "readOnly": true,
+          "type": "array"
+        },
+        "name": {
+          "description": "Immutable. The resource name of the Monitoring Metrics Scope. On input, the resource name can be specified with the scoping project ID or number. On output, the resource name is specified with the scoping project number. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}",
+          "type": "string"
+        },
+        "updateTime": {
+          "description": "Output only. The time when this Metrics Scope record was last updated.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "MonitoredProject": {
+      "description": "A project being monitored (https://cloud.google.com/monitoring/settings/multiple-projects#create-multi) by a Metrics Scope.",
+      "id": "MonitoredProject",
+      "properties": {
+        "createTime": {
+          "description": "Output only. The time when this MonitoredProject was created.",
+          "format": "google-datetime",
+          "readOnly": true,
+          "type": "string"
+        },
+        "name": {
+          "description": "Immutable. The resource name of the MonitoredProject. On input, the resource name includes the scoping project ID and monitored project ID. On output, it contains the equivalent project numbers. Example: locations/global/metricsScopes/{SCOPING_PROJECT_ID_OR_NUMBER}/projects/{MONITORED_PROJECT_ID_OR_NUMBER}",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "MosaicLayout": {
       "description": "A mosaic layout divides the available space into a grid of blocks, and overlays the grid with tiles. Unlike GridLayout, tiles may span multiple grid blocks and can be placed at arbitrary locations in the grid.",
       "id": "MosaicLayout",
diff --git a/googleapiclient/discovery_cache/documents/monitoring.v3.json b/googleapiclient/discovery_cache/documents/monitoring.v3.json
index 188ad13..9c5dd6f 100644
--- a/googleapiclient/discovery_cache/documents/monitoring.v3.json
+++ b/googleapiclient/discovery_cache/documents/monitoring.v3.json
@@ -2541,7 +2541,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210720",
   "rootUrl": "https://monitoring.googleapis.com/",
   "schemas": {
     "Aggregation": {
@@ -3162,7 +3162,7 @@
       "type": "object"
     },
     "DistributionCut": {
-      "description": "A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the count of values x in the Distribution such that range.min <= x < range.max.",
+      "description": "A DistributionCut defines a TimeSeries and thresholds used for measuring good service and total service. The TimeSeries must have ValueType = DISTRIBUTION and MetricKind = DELTA or MetricKind = CUMULATIVE. The computed good_service will be the estimated count of values in the Distribution that fall within the specified min and max.",
       "id": "DistributionCut",
       "properties": {
         "distributionFilter": {
@@ -3427,7 +3427,7 @@
       "type": "object"
     },
     "GoogleMonitoringV3Range": {
-      "description": "Range of numerical values, inclusive of min and exclusive of max. If the open range \"< range.max\" is desired, set range.min = -infinity. If the open range \">= range.min\" is desired, set range.max = infinity.",
+      "description": "Range of numerical values within min and max. If the open range \"< range.max\" is desired, set range.min = -infinity. If the open range \">= range.min\" is desired, set range.max = infinity.",
       "id": "GoogleMonitoringV3Range",
       "properties": {
         "max": {
@@ -4161,7 +4161,7 @@
       "type": "object"
     },
     "MetricRange": {
-      "description": "A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min <= x < range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE.",
+      "description": "A MetricRange is used when each window is good when the value x of a single TimeSeries satisfies range.min <= x <= range.max. The provided TimeSeries must have ValueType = INT64 or ValueType = DOUBLE and MetricKind = GAUGE.",
       "id": "MetricRange",
       "properties": {
         "range": {
diff --git a/googleapiclient/discovery_cache/documents/mybusinessaccountmanagement.v1.json b/googleapiclient/discovery_cache/documents/mybusinessaccountmanagement.v1.json
index 6067970..cb27e6a 100644
--- a/googleapiclient/discovery_cache/documents/mybusinessaccountmanagement.v1.json
+++ b/googleapiclient/discovery_cache/documents/mybusinessaccountmanagement.v1.json
@@ -530,7 +530,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://mybusinessaccountmanagement.googleapis.com/",
   "schemas": {
     "AcceptInvitationRequest": {
diff --git a/googleapiclient/discovery_cache/documents/mybusinesslodging.v1.json b/googleapiclient/discovery_cache/documents/mybusinesslodging.v1.json
index b7031c8..2fe0a4f 100644
--- a/googleapiclient/discovery_cache/documents/mybusinesslodging.v1.json
+++ b/googleapiclient/discovery_cache/documents/mybusinesslodging.v1.json
@@ -194,7 +194,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://mybusinesslodging.googleapis.com/",
   "schemas": {
     "Accessibility": {
diff --git a/googleapiclient/discovery_cache/documents/mybusinessnotifications.v1.json b/googleapiclient/discovery_cache/documents/mybusinessnotifications.v1.json
index 40c8396..a3ec63c 100644
--- a/googleapiclient/discovery_cache/documents/mybusinessnotifications.v1.json
+++ b/googleapiclient/discovery_cache/documents/mybusinessnotifications.v1.json
@@ -130,7 +130,7 @@
           ],
           "parameters": {
             "name": {
-              "description": "Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notifications/setting`.",
+              "description": "Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notificationSetting`.",
               "location": "path",
               "pattern": "^accounts/[^/]+/notificationSetting$",
               "required": true,
@@ -154,7 +154,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://mybusinessnotifications.googleapis.com/",
   "schemas": {
     "NotificationSetting": {
@@ -162,7 +162,7 @@
       "id": "NotificationSetting",
       "properties": {
         "name": {
-          "description": "Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notifications/setting`.",
+          "description": "Required. The resource name this setting is for. This is of the form `accounts/{account_id}/notificationSetting`.",
           "type": "string"
         },
         "notificationTypes": {
@@ -178,7 +178,8 @@
               "UPDATED_QUESTION",
               "NEW_ANSWER",
               "UPDATED_ANSWER",
-              "DUPLICATE_LOCATION"
+              "DUPLICATE_LOCATION",
+              "LOSS_OF_VOICE_OF_MERCHANT"
             ],
             "enumDescriptions": [
               "No notification type. Will not match any notifications.",
@@ -190,7 +191,8 @@
               "A question of the location is updated. The notification will provide the resource name of question.",
               "A new answer is added to the location. The notification will provide the resource name of question and answer.",
               "An answer of the location is updated. The notification will provide the resource name of question and answer.",
-              "Indicates whether there is a change in location metadata's duplicate location field."
+              "Indicates whether there is a change in location metadata's duplicate location field.",
+              "Indicates whether the location has a loss in voice of merchant status. Call GetVoiceOfMerchantState rpc for more details"
             ],
             "type": "string"
           },
diff --git a/googleapiclient/discovery_cache/documents/mybusinessplaceactions.v1.json b/googleapiclient/discovery_cache/documents/mybusinessplaceactions.v1.json
index 0d9eecd..f0f7447 100644
--- a/googleapiclient/discovery_cache/documents/mybusinessplaceactions.v1.json
+++ b/googleapiclient/discovery_cache/documents/mybusinessplaceactions.v1.json
@@ -281,7 +281,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://mybusinessplaceactions.googleapis.com/",
   "schemas": {
     "Empty": {
diff --git a/googleapiclient/discovery_cache/documents/networkmanagement.v1beta1.json b/googleapiclient/discovery_cache/documents/networkmanagement.v1beta1.json
index 10bc94a..fb12473 100644
--- a/googleapiclient/discovery_cache/documents/networkmanagement.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/networkmanagement.v1beta1.json
@@ -591,7 +591,7 @@
       }
     }
   },
-  "revision": "20210624",
+  "revision": "20210721",
   "rootUrl": "https://networkmanagement.googleapis.com/",
   "schemas": {
     "AbortInfo": {
@@ -1727,7 +1727,8 @@
             "NEXT_HOP_VPN_GATEWAY",
             "NEXT_HOP_INTERNET_GATEWAY",
             "NEXT_HOP_BLACKHOLE",
-            "NEXT_HOP_ILB"
+            "NEXT_HOP_ILB",
+            "NEXT_HOP_ROUTER_APPLIANCE"
           ],
           "enumDescriptions": [
             "Unspecified type. Default value.",
@@ -1740,7 +1741,8 @@
             "Next hop is a VPN gateway. This scenario only happens when tracing connectivity from an on-premises network to Google Cloud through a VPN. The analysis simulates a packet departing from the on-premises network through a VPN tunnel and arriving at a Cloud VPN gateway.",
             "Next hop is an internet gateway.",
             "Next hop is blackhole; that is, the next hop either does not exist or is not running.",
-            "Next hop is the forwarding rule of an Internal Load Balancer."
+            "Next hop is the forwarding rule of an Internal Load Balancer.",
+            "Next hop is a [router appliance instance](https://cloud.google.com/network-connectivity/docs/network-connectivity-center/concepts/ra-overview)."
           ],
           "type": "string"
         },
diff --git a/googleapiclient/discovery_cache/documents/notebooks.v1.json b/googleapiclient/discovery_cache/documents/notebooks.v1.json
index 9f686dc..9a4d890 100644
--- a/googleapiclient/discovery_cache/documents/notebooks.v1.json
+++ b/googleapiclient/discovery_cache/documents/notebooks.v1.json
@@ -1609,7 +1609,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210715",
   "rootUrl": "https://notebooks.googleapis.com/",
   "schemas": {
     "AcceleratorConfig": {
@@ -2498,17 +2498,17 @@
       "id": "LocalDisk",
       "properties": {
         "autoDelete": {
-          "description": "Output only. Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance).",
+          "description": "Optional. Output only. Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance).",
           "readOnly": true,
           "type": "boolean"
         },
         "boot": {
-          "description": "Output only. Indicates that this is a boot disk. The virtual machine will use the first partition of the disk for its root filesystem.",
+          "description": "Optional. Output only. Indicates that this is a boot disk. The virtual machine will use the first partition of the disk for its root filesystem.",
           "readOnly": true,
           "type": "boolean"
         },
         "deviceName": {
-          "description": "Output only. Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disk-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks.",
+          "description": "Optional. Output only. Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance. If not specified, the server chooses a default device name to apply to this disk, in the form persistent-disk-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks.",
           "readOnly": true,
           "type": "string"
         },
@@ -2521,14 +2521,14 @@
           "type": "array"
         },
         "index": {
-          "description": "Output only. [Output Only] A zero-based index to this disk, where 0 is reserved for the boot disk. If you have many disks attached to an instance, each disk would have a unique index number.",
+          "description": "Output only. A zero-based index to this disk, where 0 is reserved for the boot disk. If you have many disks attached to an instance, each disk would have a unique index number.",
           "format": "int32",
           "readOnly": true,
           "type": "integer"
         },
         "initializeParams": {
           "$ref": "LocalDiskInitializeParams",
-          "description": "Input only. [Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance. This property is mutually exclusive with the source property; you can only define one or the other, but not both."
+          "description": "Input only. Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance. This property is mutually exclusive with the source property; you can only define one or the other, but not both."
         },
         "interface": {
           "description": "Specifies the disk interface to use for attaching this disk, which is either SCSI or NVME. The default is SCSI. Persistent disks must always use SCSI and the request will fail if you attempt to attach a persistent disk in any other format than SCSI. Local SSDs can use either NVME or SCSI. For performance characteristics of SCSI over NVMe, see Local SSD performance. Valid values: NVME SCSI",
@@ -2540,7 +2540,7 @@
           "type": "string"
         },
         "licenses": {
-          "description": "Output only. [Output Only] Any valid publicly visible licenses.",
+          "description": "Output only. Any valid publicly visible licenses.",
           "items": {
             "type": "string"
           },
@@ -2563,7 +2563,7 @@
       "type": "object"
     },
     "LocalDiskInitializeParams": {
-      "description": "[Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new runtime. This property is mutually exclusive with the source property; you can only define one or the other, but not both.",
+      "description": "Input only. Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new runtime. This property is mutually exclusive with the source property; you can only define one or the other, but not both.",
       "id": "LocalDiskInitializeParams",
       "properties": {
         "description": {
@@ -2875,7 +2875,7 @@
           "readOnly": true
         },
         "name": {
-          "description": "Output only. The resource name of the runtime. Format: `projects/{project}/locations/{location}/runtimes/{runtime}`",
+          "description": "Output only. The resource name of the runtime. Format: `projects/{project}/locations/{location}/runtimes/{runtimeId}`",
           "readOnly": true,
           "type": "string"
         },
@@ -2996,11 +2996,11 @@
       "type": "object"
     },
     "RuntimeGuestOsFeature": {
-      "description": "A list of features to enable on the guest operating system. Applicable only for bootable images. Read Enabling guest operating system features to see a list of available options. Guest OS features for boot disk.",
+      "description": "Optional. A list of features to enable on the guest operating system. Applicable only for bootable images. Read [Enabling guest operating system features](https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features) to see a list of available options. Guest OS features for boot disk.",
       "id": "RuntimeGuestOsFeature",
       "properties": {
         "type": {
-          "description": "The ID of a supported feature. Read Enabling guest operating system features to see a list of available options. Valid values: FEATURE_TYPE_UNSPECIFIED MULTI_IP_SUBNET SECURE_BOOT UEFI_COMPATIBLE VIRTIO_SCSI_MULTIQUEUE WINDOWS",
+          "description": "The ID of a supported feature. Read [Enabling guest operating system features](https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#guest-os-features) to see a list of available options. Valid values: * FEATURE_TYPE_UNSPECIFIED * MULTI_IP_SUBNET * SECURE_BOOT * UEFI_COMPATIBLE * VIRTIO_SCSI_MULTIQUEUE * WINDOWS",
           "type": "string"
         }
       },
@@ -3022,7 +3022,7 @@
       "type": "object"
     },
     "RuntimeShieldedInstanceConfig": {
-      "description": "A set of Shielded Instance options. Check [Images using supported Shielded VM features] Not all combinations are valid.",
+      "description": "A set of Shielded Instance options. Check [Images using supported Shielded VM features](https://cloud.google.com/compute/docs/instances/modifying-shielded-vm). Not all combinations are valid.",
       "id": "RuntimeShieldedInstanceConfig",
       "properties": {
         "enableIntegrityMonitoring": {
@@ -3041,7 +3041,7 @@
       "type": "object"
     },
     "RuntimeSoftwareConfig": {
-      "description": "Specifies the selection and config of software inside the runtime. / The properties to set on runtime. Properties keys are specified in `key:value` format, for example: * idle_shutdown: idle_shutdown=true * idle_shutdown_timeout: idle_shutdown_timeout=180 * report-system-health: report-system-health=true",
+      "description": "Specifies the selection and configuration of software inside the runtime. The properties to set on runtime. Properties keys are specified in `key:value` format, for example: * `idle_shutdown: true` * `idle_shutdown_timeout: 180` * `report-system-health: true`",
       "id": "RuntimeSoftwareConfig",
       "properties": {
         "customGpuDriverPath": {
diff --git a/googleapiclient/discovery_cache/documents/ondemandscanning.v1.json b/googleapiclient/discovery_cache/documents/ondemandscanning.v1.json
index 67987a8..4a8ccf1 100644
--- a/googleapiclient/discovery_cache/documents/ondemandscanning.v1.json
+++ b/googleapiclient/discovery_cache/documents/ondemandscanning.v1.json
@@ -339,7 +339,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210717",
   "rootUrl": "https://ondemandscanning.googleapis.com/",
   "schemas": {
     "AliasContext": {
@@ -1166,13 +1166,15 @@
             "PACKAGE_TYPE_UNSPECIFIED",
             "OS",
             "MAVEN",
-            "GO"
+            "GO",
+            "GO_STDLIB"
           ],
           "enumDescriptions": [
             "",
             "Operating System",
-            "",
-            ""
+            "Java packages from Maven.",
+            "Go third-party packages.",
+            "Go toolchain + standard library packages."
           ],
           "type": "string"
         },
diff --git a/googleapiclient/discovery_cache/documents/ondemandscanning.v1beta1.json b/googleapiclient/discovery_cache/documents/ondemandscanning.v1beta1.json
index 5ccc5b8..ee88e9a 100644
--- a/googleapiclient/discovery_cache/documents/ondemandscanning.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/ondemandscanning.v1beta1.json
@@ -339,7 +339,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210717",
   "rootUrl": "https://ondemandscanning.googleapis.com/",
   "schemas": {
     "AliasContext": {
@@ -1166,13 +1166,15 @@
             "PACKAGE_TYPE_UNSPECIFIED",
             "OS",
             "MAVEN",
-            "GO"
+            "GO",
+            "GO_STDLIB"
           ],
           "enumDescriptions": [
             "",
             "Operating System",
-            "",
-            ""
+            "Java packages from Maven.",
+            "Go third-party packages.",
+            "Go toolchain + standard library packages."
           ],
           "type": "string"
         },
diff --git a/googleapiclient/discovery_cache/documents/orgpolicy.v2.json b/googleapiclient/discovery_cache/documents/orgpolicy.v2.json
index d486260..619b2ed 100644
--- a/googleapiclient/discovery_cache/documents/orgpolicy.v2.json
+++ b/googleapiclient/discovery_cache/documents/orgpolicy.v2.json
@@ -751,7 +751,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://orgpolicy.googleapis.com/",
   "schemas": {
     "GoogleCloudOrgpolicyV2Constraint": {
diff --git a/googleapiclient/discovery_cache/documents/oslogin.v1.json b/googleapiclient/discovery_cache/documents/oslogin.v1.json
index 132a491..65b2e0f 100644
--- a/googleapiclient/discovery_cache/documents/oslogin.v1.json
+++ b/googleapiclient/discovery_cache/documents/oslogin.v1.json
@@ -306,7 +306,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210717",
   "rootUrl": "https://oslogin.googleapis.com/",
   "schemas": {
     "Empty": {
diff --git a/googleapiclient/discovery_cache/documents/oslogin.v1alpha.json b/googleapiclient/discovery_cache/documents/oslogin.v1alpha.json
index 34cdc57..54d1e2f 100644
--- a/googleapiclient/discovery_cache/documents/oslogin.v1alpha.json
+++ b/googleapiclient/discovery_cache/documents/oslogin.v1alpha.json
@@ -374,7 +374,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210717",
   "rootUrl": "https://oslogin.googleapis.com/",
   "schemas": {
     "Empty": {
diff --git a/googleapiclient/discovery_cache/documents/oslogin.v1beta.json b/googleapiclient/discovery_cache/documents/oslogin.v1beta.json
index 61a0645..bcbb237 100644
--- a/googleapiclient/discovery_cache/documents/oslogin.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/oslogin.v1beta.json
@@ -344,7 +344,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210717",
   "rootUrl": "https://oslogin.googleapis.com/",
   "schemas": {
     "Empty": {
diff --git a/googleapiclient/discovery_cache/documents/pagespeedonline.v5.json b/googleapiclient/discovery_cache/documents/pagespeedonline.v5.json
index 292af03..3cd7c2a 100644
--- a/googleapiclient/discovery_cache/documents/pagespeedonline.v5.json
+++ b/googleapiclient/discovery_cache/documents/pagespeedonline.v5.json
@@ -193,7 +193,7 @@
       }
     }
   },
-  "revision": "20210716",
+  "revision": "20210723",
   "rootUrl": "https://pagespeedonline.googleapis.com/",
   "schemas": {
     "AuditRefs": {
diff --git a/googleapiclient/discovery_cache/documents/paymentsresellersubscription.v1.json b/googleapiclient/discovery_cache/documents/paymentsresellersubscription.v1.json
index e02a954..40cf93d 100644
--- a/googleapiclient/discovery_cache/documents/paymentsresellersubscription.v1.json
+++ b/googleapiclient/discovery_cache/documents/paymentsresellersubscription.v1.json
@@ -366,7 +366,7 @@
       }
     }
   },
-  "revision": "20210719",
+  "revision": "20210725",
   "rootUrl": "https://paymentsresellersubscription.googleapis.com/",
   "schemas": {
     "GoogleCloudPaymentsResellerSubscriptionV1CancelSubscriptionRequest": {
diff --git a/googleapiclient/discovery_cache/documents/people.v1.json b/googleapiclient/discovery_cache/documents/people.v1.json
index 3381c07..83025d0 100644
--- a/googleapiclient/discovery_cache/documents/people.v1.json
+++ b/googleapiclient/discovery_cache/documents/people.v1.json
@@ -395,7 +395,7 @@
           ]
         },
         "list": {
-          "description": "List all \"Other contacts\", that is contacts that are not in a contact group. \"Other contacts\" are typically auto created contacts from interactions. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the user's other contacts that have changed](/people/v1/other-contacts#list_the_users_other_contacts_that_have_changed).",
+          "description": "List all \"Other contacts\", that is contacts that are not in a contact group. \"Other contacts\" are typically auto created contacts from interactions. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the user's other contacts that have changed](/people/v1/other-contacts#list_the_users_other_contacts_that_have_changed).",
           "flatPath": "v1/otherContacts",
           "httpMethod": "GET",
           "id": "people.otherContacts.list",
@@ -791,7 +791,7 @@
           ]
         },
         "listDirectoryPeople": {
-          "description": "Provides a list of domain profiles and domain contacts in the authenticated user's domain directory. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the directory people that have changed](/people/v1/directory#list_the_directory_people_that_have_changed).",
+          "description": "Provides a list of domain profiles and domain contacts in the authenticated user's domain directory. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the directory people that have changed](/people/v1/directory#list_the_directory_people_that_have_changed).",
           "flatPath": "v1/people:listDirectoryPeople",
           "httpMethod": "GET",
           "id": "people.people.listDirectoryPeople",
@@ -1074,7 +1074,7 @@
         "connections": {
           "methods": {
             "list": {
-              "description": "Provides a list of the authenticated user's contacts. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. See example usage at [List the user's contacts that have changed](/people/v1/contacts#list_the_users_contacts_that_have_changed).",
+              "description": "Provides a list of the authenticated user's contacts. Sync tokens expire 7 days after the full sync. A request with an expired sync token will result in a 410 error. In the case of such an error clients should make a full sync request without a `sync_token`. The first page of a full sync request has an additional quota. If the quota is exceeded, a 429 error will be returned. This quota is fixed and can not be increased. When the `sync_token` is specified, resources deleted since the last sync will be returned as a person with `PersonMetadata.deleted` set to true. When the `page_token` or `sync_token` is specified, all other request parameters must match the first call. Writes may have a propagation delay of several minutes for sync requests. Incremental syncs are not intended for read-after-write use cases. See example usage at [List the user's contacts that have changed](/people/v1/contacts#list_the_users_contacts_that_have_changed).",
               "flatPath": "v1/people/{peopleId}/connections",
               "httpMethod": "GET",
               "id": "people.people.connections.list",
@@ -1172,7 +1172,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210720",
   "rootUrl": "https://people.googleapis.com/",
   "schemas": {
     "Address": {
@@ -1832,13 +1832,17 @@
       "id": "FieldMetadata",
       "properties": {
         "primary": {
-          "description": "True if the field is the primary field; false if the field is a secondary field.",
+          "description": "True if the field is the primary field for the person.",
           "type": "boolean"
         },
         "source": {
           "$ref": "Source",
           "description": "The source of the field."
         },
+        "sourcePrimary": {
+          "description": "True if the field is the primary field for the source.",
+          "type": "boolean"
+        },
         "verified": {
           "description": "Output only. True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person.",
           "readOnly": true,
diff --git a/googleapiclient/discovery_cache/documents/playablelocations.v3.json b/googleapiclient/discovery_cache/documents/playablelocations.v3.json
index b4051c6..d9c6603 100644
--- a/googleapiclient/discovery_cache/documents/playablelocations.v3.json
+++ b/googleapiclient/discovery_cache/documents/playablelocations.v3.json
@@ -146,7 +146,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://playablelocations.googleapis.com/",
   "schemas": {
     "GoogleMapsPlayablelocationsV3Impression": {
diff --git a/googleapiclient/discovery_cache/documents/playcustomapp.v1.json b/googleapiclient/discovery_cache/documents/playcustomapp.v1.json
index 4d8419b..f7b663b 100644
--- a/googleapiclient/discovery_cache/documents/playcustomapp.v1.json
+++ b/googleapiclient/discovery_cache/documents/playcustomapp.v1.json
@@ -158,7 +158,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://playcustomapp.googleapis.com/",
   "schemas": {
     "CustomApp": {
diff --git a/googleapiclient/discovery_cache/documents/policysimulator.v1.json b/googleapiclient/discovery_cache/documents/policysimulator.v1.json
index f14527d..78ec766 100644
--- a/googleapiclient/discovery_cache/documents/policysimulator.v1.json
+++ b/googleapiclient/discovery_cache/documents/policysimulator.v1.json
@@ -493,7 +493,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://policysimulator.googleapis.com/",
   "schemas": {
     "GoogleCloudPolicysimulatorV1AccessStateDiff": {
diff --git a/googleapiclient/discovery_cache/documents/policysimulator.v1beta1.json b/googleapiclient/discovery_cache/documents/policysimulator.v1beta1.json
index c760fd9..ff09197 100644
--- a/googleapiclient/discovery_cache/documents/policysimulator.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/policysimulator.v1beta1.json
@@ -493,7 +493,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://policysimulator.googleapis.com/",
   "schemas": {
     "GoogleCloudPolicysimulatorV1Replay": {
diff --git a/googleapiclient/discovery_cache/documents/policytroubleshooter.v1.json b/googleapiclient/discovery_cache/documents/policytroubleshooter.v1.json
index d5a731b..35d7e8b 100644
--- a/googleapiclient/discovery_cache/documents/policytroubleshooter.v1.json
+++ b/googleapiclient/discovery_cache/documents/policytroubleshooter.v1.json
@@ -128,7 +128,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://policytroubleshooter.googleapis.com/",
   "schemas": {
     "GoogleCloudPolicytroubleshooterV1AccessTuple": {
diff --git a/googleapiclient/discovery_cache/documents/policytroubleshooter.v1beta.json b/googleapiclient/discovery_cache/documents/policytroubleshooter.v1beta.json
index 986d4ce..e3dd76a 100644
--- a/googleapiclient/discovery_cache/documents/policytroubleshooter.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/policytroubleshooter.v1beta.json
@@ -128,7 +128,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://policytroubleshooter.googleapis.com/",
   "schemas": {
     "GoogleCloudPolicytroubleshooterV1betaAccessTuple": {
diff --git a/googleapiclient/discovery_cache/documents/privateca.v1.json b/googleapiclient/discovery_cache/documents/privateca.v1.json
index bf62fbc..f4b09b0 100644
--- a/googleapiclient/discovery_cache/documents/privateca.v1.json
+++ b/googleapiclient/discovery_cache/documents/privateca.v1.json
@@ -1030,7 +1030,7 @@
                           "type": "string"
                         },
                         "requestId": {
-                          "description": "Optional. An ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed. The server will guarantee that for at least 60 minutes since the first request. For example, consider a situation where you make an initial request and t he request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments. The request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).",
+                          "description": "Optional. An ID to identify requests. Specify a unique request ID so that if you must retry your request, the server will know to ignore the request if it has already been completed. The server will guarantee that for at least 60 minutes since the first request. For example, consider a situation where you make an initial request and the request times out. If you make the request again with the same request ID, the server can check if original operation with the same request ID was received, and if so, will ignore the second request. This prevents clients from accidentally creating duplicate commitments. The request ID must be a valid UUID with the exception that zero UUID is not supported (00000000-0000-0000-0000-000000000000).",
                           "location": "query",
                           "type": "string"
                         },
@@ -1590,7 +1590,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210714",
   "rootUrl": "https://privateca.googleapis.com/",
   "schemas": {
     "AccessUrls": {
diff --git a/googleapiclient/discovery_cache/documents/privateca.v1beta1.json b/googleapiclient/discovery_cache/documents/privateca.v1beta1.json
index 78ee3e2..b18bcfa 100644
--- a/googleapiclient/discovery_cache/documents/privateca.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/privateca.v1beta1.json
@@ -1254,7 +1254,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210721",
   "rootUrl": "https://privateca.googleapis.com/",
   "schemas": {
     "AccessUrls": {
@@ -2823,7 +2823,7 @@
       "id": "SubordinateConfig",
       "properties": {
         "certificateAuthority": {
-          "description": "Required. This can refer to a CertificateAuthority in the same project that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.",
+          "description": "Required. This can refer to a CertificateAuthority that was used to create a subordinate CertificateAuthority. This field is used for information and usability purposes only. The resource name is in the format `projects/*/locations/*/certificateAuthorities/*`.",
           "type": "string"
         },
         "pemIssuerChain": {
diff --git a/googleapiclient/discovery_cache/documents/prod_tt_sasportal.v1alpha1.json b/googleapiclient/discovery_cache/documents/prod_tt_sasportal.v1alpha1.json
index 3e12112..fd1177a 100644
--- a/googleapiclient/discovery_cache/documents/prod_tt_sasportal.v1alpha1.json
+++ b/googleapiclient/discovery_cache/documents/prod_tt_sasportal.v1alpha1.json
@@ -2484,7 +2484,7 @@
       }
     }
   },
-  "revision": "20210715",
+  "revision": "20210723",
   "rootUrl": "https://prod-tt-sasportal.googleapis.com/",
   "schemas": {
     "SasPortalAssignment": {
diff --git a/googleapiclient/discovery_cache/documents/pubsub.v1.json b/googleapiclient/discovery_cache/documents/pubsub.v1.json
index 3104aa0..5905e02 100644
--- a/googleapiclient/discovery_cache/documents/pubsub.v1.json
+++ b/googleapiclient/discovery_cache/documents/pubsub.v1.json
@@ -1424,7 +1424,7 @@
       }
     }
   },
-  "revision": "20210705",
+  "revision": "20210712",
   "rootUrl": "https://pubsub.googleapis.com/",
   "schemas": {
     "AcknowledgeRequest": {
diff --git a/googleapiclient/discovery_cache/documents/pubsub.v1beta1a.json b/googleapiclient/discovery_cache/documents/pubsub.v1beta1a.json
index 1d40098..bb89476 100644
--- a/googleapiclient/discovery_cache/documents/pubsub.v1beta1a.json
+++ b/googleapiclient/discovery_cache/documents/pubsub.v1beta1a.json
@@ -457,7 +457,7 @@
       }
     }
   },
-  "revision": "20210705",
+  "revision": "20210712",
   "rootUrl": "https://pubsub.googleapis.com/",
   "schemas": {
     "AcknowledgeRequest": {
diff --git a/googleapiclient/discovery_cache/documents/pubsub.v1beta2.json b/googleapiclient/discovery_cache/documents/pubsub.v1beta2.json
index 4db52f5..b3397da 100644
--- a/googleapiclient/discovery_cache/documents/pubsub.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/pubsub.v1beta2.json
@@ -724,7 +724,7 @@
       }
     }
   },
-  "revision": "20210705",
+  "revision": "20210712",
   "rootUrl": "https://pubsub.googleapis.com/",
   "schemas": {
     "AcknowledgeRequest": {
diff --git a/googleapiclient/discovery_cache/documents/pubsublite.v1.json b/googleapiclient/discovery_cache/documents/pubsublite.v1.json
index e7ed952..fb52f25 100644
--- a/googleapiclient/discovery_cache/documents/pubsublite.v1.json
+++ b/googleapiclient/discovery_cache/documents/pubsublite.v1.json
@@ -690,7 +690,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210720",
   "rootUrl": "https://pubsublite.googleapis.com/",
   "schemas": {
     "Capacity": {
diff --git a/googleapiclient/discovery_cache/documents/realtimebidding.v1.json b/googleapiclient/discovery_cache/documents/realtimebidding.v1.json
index 38a5429..a12a76b 100644
--- a/googleapiclient/discovery_cache/documents/realtimebidding.v1.json
+++ b/googleapiclient/discovery_cache/documents/realtimebidding.v1.json
@@ -1140,7 +1140,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210724",
   "rootUrl": "https://realtimebidding.googleapis.com/",
   "schemas": {
     "ActivatePretargetingConfigRequest": {
diff --git a/googleapiclient/discovery_cache/documents/realtimebidding.v1alpha.json b/googleapiclient/discovery_cache/documents/realtimebidding.v1alpha.json
index ed87817..f20edd4 100644
--- a/googleapiclient/discovery_cache/documents/realtimebidding.v1alpha.json
+++ b/googleapiclient/discovery_cache/documents/realtimebidding.v1alpha.json
@@ -234,7 +234,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210724",
   "rootUrl": "https://realtimebidding.googleapis.com/",
   "schemas": {
     "ActivateBiddingFunctionRequest": {
diff --git a/googleapiclient/discovery_cache/documents/recaptchaenterprise.v1.json b/googleapiclient/discovery_cache/documents/recaptchaenterprise.v1.json
index b505ba1..0a76a21 100644
--- a/googleapiclient/discovery_cache/documents/recaptchaenterprise.v1.json
+++ b/googleapiclient/discovery_cache/documents/recaptchaenterprise.v1.json
@@ -375,7 +375,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://recaptchaenterprise.googleapis.com/",
   "schemas": {
     "GoogleCloudRecaptchaenterpriseV1AndroidKeySettings": {
diff --git a/googleapiclient/discovery_cache/documents/recommender.v1.json b/googleapiclient/discovery_cache/documents/recommender.v1.json
index 262b4e8..d3d0120 100644
--- a/googleapiclient/discovery_cache/documents/recommender.v1.json
+++ b/googleapiclient/discovery_cache/documents/recommender.v1.json
@@ -1178,7 +1178,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://recommender.googleapis.com/",
   "schemas": {
     "GoogleCloudRecommenderV1CostProjection": {
diff --git a/googleapiclient/discovery_cache/documents/recommender.v1beta1.json b/googleapiclient/discovery_cache/documents/recommender.v1beta1.json
index c4f32a6..235826f 100644
--- a/googleapiclient/discovery_cache/documents/recommender.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/recommender.v1beta1.json
@@ -1178,7 +1178,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://recommender.googleapis.com/",
   "schemas": {
     "GoogleCloudRecommenderV1beta1CostProjection": {
diff --git a/googleapiclient/discovery_cache/documents/reseller.v1.json b/googleapiclient/discovery_cache/documents/reseller.v1.json
index ff0689b..9d1e9a8 100644
--- a/googleapiclient/discovery_cache/documents/reseller.v1.json
+++ b/googleapiclient/discovery_cache/documents/reseller.v1.json
@@ -111,7 +111,7 @@
     "customers": {
       "methods": {
         "get": {
-          "description": "Get a customer account. Use this operation to see a customer account already in your reseller management, or to see the minimal account information for an existing customer that you do not manage. For more information about the API response for existing customers, see [retrieving a customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#get_customer).",
+          "description": "Gets a customer account. Use this operation to see a customer account already in your reseller management, or to see the minimal account information for an existing customer that you do not manage. For more information about the API response for existing customers, see [retrieving a customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#get_customer).",
           "flatPath": "apps/reseller/v1/customers/{customerId}",
           "httpMethod": "GET",
           "id": "reseller.customers.get",
@@ -136,7 +136,7 @@
           ]
         },
         "insert": {
-          "description": "Order a new customer's account. Before ordering a new customer account, establish whether the customer account already exists using the [`customers.get`](/admin-sdk/reseller/v1/reference/customers/get) If the customer account exists as a direct Google account or as a resold customer account from another reseller, use the `customerAuthToken\\` as described in [order a resold account for an existing customer](/admin-sdk/reseller/v1/how-tos/manage_customers#create_existing_customer). For more information about ordering a new customer account, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#create_customer). After creating a new customer account, you must provision a user as an administrator. The customer's administrator is required to sign in to the Admin console and sign the G Suite via Reseller agreement to activate the account. Resellers are prohibited from signing the G Suite via Reseller agreement on the customer's behalf. For more information, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#tos).",
+          "description": "Orders a new customer's account. Before ordering a new customer account, establish whether the customer account already exists using the [`customers.get`](/admin-sdk/reseller/v1/reference/customers/get) If the customer account exists as a direct Google account or as a resold customer account from another reseller, use the `customerAuthToken\\` as described in [order a resold account for an existing customer](/admin-sdk/reseller/v1/how-tos/manage_customers#create_existing_customer). For more information about ordering a new customer account, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#create_customer). After creating a new customer account, you must provision a user as an administrator. The customer's administrator is required to sign in to the Admin console and sign the G Suite via Reseller agreement to activate the account. Resellers are prohibited from signing the G Suite via Reseller agreement on the customer's behalf. For more information, see [order a new customer account](/admin-sdk/reseller/v1/how-tos/manage_customers#tos).",
           "flatPath": "apps/reseller/v1/customers",
           "httpMethod": "POST",
           "id": "reseller.customers.insert",
@@ -160,7 +160,7 @@
           ]
         },
         "patch": {
-          "description": "Update a customer account's settings. This method supports patch semantics.",
+          "description": "Updates a customer account's settings. This method supports patch semantics. You cannot update `customerType` via the Reseller API, but a `\"team\"` customer can verify their domain and become `customerType = \"domain\"`. For more information, see [Verify your domain to unlock Essentials features](https://support.google.com/a/answer/9122284).",
           "flatPath": "apps/reseller/v1/customers/{customerId}",
           "httpMethod": "PATCH",
           "id": "reseller.customers.patch",
@@ -187,7 +187,7 @@
           ]
         },
         "update": {
-          "description": "Update a customer account's settings. For more information, see [update a customer's settings](/admin-sdk/reseller/v1/how-tos/manage_customers#update_customer).",
+          "description": "Updates a customer account's settings. You cannot update `customerType` via the Reseller API, but a `\"team\"` customer can verify their domain and become `customerType = \"domain\"`. For more information, see [update a customer's settings](/admin-sdk/reseller/v1/how-tos/manage_customers#update_customer).",
           "flatPath": "apps/reseller/v1/customers/{customerId}",
           "httpMethod": "PUT",
           "id": "reseller.customers.update",
@@ -311,7 +311,7 @@
           ]
         },
         "changePlan": {
-          "description": "Update a subscription plan. Use this method to update a plan for a 30-day trial or a flexible plan subscription to an annual commitment plan with monthly or yearly payments. How a plan is updated differs depending on the plan and the products. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_plan).",
+          "description": "Updates a subscription plan. Use this method to update a plan for a 30-day trial or a flexible plan subscription to an annual commitment plan with monthly or yearly payments. How a plan is updated differs depending on the plan and the products. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_plan).",
           "flatPath": "apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changePlan",
           "httpMethod": "POST",
           "id": "reseller.subscriptions.changePlan",
@@ -345,7 +345,7 @@
           ]
         },
         "changeRenewalSettings": {
-          "description": "Update a user license's renewal settings. This is applicable for accounts with annual commitment plans only. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_renewal).",
+          "description": "Updates a user license's renewal settings. This is applicable for accounts with annual commitment plans only. For more information, see the description in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_renewal).",
           "flatPath": "apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changeRenewalSettings",
           "httpMethod": "POST",
           "id": "reseller.subscriptions.changeRenewalSettings",
@@ -379,7 +379,7 @@
           ]
         },
         "changeSeats": {
-          "description": "Update a subscription's user license settings. For more information about updating an annual commitment plan or a flexible plan subscription\u2019s licenses, see [Manage Subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_seat).",
+          "description": "Updates a subscription's user license settings. For more information about updating an annual commitment plan or a flexible plan subscription\u2019s licenses, see [Manage Subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#update_subscription_seat).",
           "flatPath": "apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changeSeats",
           "httpMethod": "POST",
           "id": "reseller.subscriptions.changeSeats",
@@ -413,7 +413,7 @@
           ]
         },
         "delete": {
-          "description": "Cancel, suspend, or transfer a subscription to direct.",
+          "description": "Cancels, suspends, or transfers a subscription to direct.",
           "flatPath": "apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}",
           "httpMethod": "DELETE",
           "id": "reseller.subscriptions.delete",
@@ -458,7 +458,7 @@
           ]
         },
         "get": {
-          "description": "Get a specific subscription. The `subscriptionId` can be found using the [Retrieve all reseller subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_all_subscriptions) method. For more information about retrieving a specific subscription, see the information descrived in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_subscription).",
+          "description": "Gets a specific subscription. The `subscriptionId` can be found using the [Retrieve all reseller subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_all_subscriptions) method. For more information about retrieving a specific subscription, see the information descrived in [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#get_subscription).",
           "flatPath": "apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}",
           "httpMethod": "GET",
           "id": "reseller.subscriptions.get",
@@ -490,7 +490,7 @@
           ]
         },
         "insert": {
-          "description": "Create or transfer a subscription. Create a subscription for a customer's account that you ordered using the [Order a new customer account](/admin-sdk/reseller/v1/reference/customers/insert.html) method. For more information about creating a subscription for different payment plans, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#create_subscription).\\ If you did not order the customer's account using the customer insert method, use the customer's `customerAuthToken` when creating a subscription for that customer. If transferring a G Suite subscription with an associated Google Drive or Google Vault subscription, use the [batch operation](/admin-sdk/reseller/v1/how-tos/batch.html) to transfer all of these subscriptions. For more information, see how to [transfer subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#transfer_a_subscription).",
+          "description": "Creates or transfer a subscription. Create a subscription for a customer's account that you ordered using the [Order a new customer account](/admin-sdk/reseller/v1/reference/customers/insert.html) method. For more information about creating a subscription for different payment plans, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#create_subscription).\\ If you did not order the customer's account using the customer insert method, use the customer's `customerAuthToken` when creating a subscription for that customer. If transferring a G Suite subscription with an associated Google Drive or Google Vault subscription, use the [batch operation](/admin-sdk/reseller/v1/how-tos/batch.html) to transfer all of these subscriptions. For more information, see how to [transfer subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions#transfer_a_subscription).",
           "flatPath": "apps/reseller/v1/customers/{customerId}/subscriptions",
           "httpMethod": "POST",
           "id": "reseller.subscriptions.insert",
@@ -522,7 +522,7 @@
           ]
         },
         "list": {
-          "description": "List of subscriptions managed by the reseller. The list can be all subscriptions, all of a customer's subscriptions, or all of a customer's transferable subscriptions. Optionally, this method can filter the response by a `customerNamePrefix`. For more information, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions).",
+          "description": "Lists of subscriptions managed by the reseller. The list can be all subscriptions, all of a customer's subscriptions, or all of a customer's transferable subscriptions. Optionally, this method can filter the response by a `customerNamePrefix`. For more information, see [manage subscriptions](/admin-sdk/reseller/v1/how-tos/manage_subscriptions).",
           "flatPath": "apps/reseller/v1/subscriptions",
           "httpMethod": "GET",
           "id": "reseller.subscriptions.list",
@@ -631,7 +631,7 @@
       }
     }
   },
-  "revision": "20210702",
+  "revision": "20210720",
   "rootUrl": "https://reseller.googleapis.com/",
   "schemas": {
     "Address": {
@@ -715,7 +715,7 @@
       "id": "Customer",
       "properties": {
         "alternateEmail": {
-          "description": "Like the \"Customer email\" in the reseller tools, this email is the secondary contact used if something happens to the customer's service such as service outage or a security issue. This property is required when creating a new customer and should not use the same domain as `customerDomain`.",
+          "description": "Like the \"Customer email\" in the reseller tools, this email is the secondary contact used if something happens to the customer's service such as service outage or a security issue. This property is required when creating a new \"domain\" customer and should not use the same domain as `customerDomain`. The `alternateEmail` field is not necessary to create a \"team\" customer.",
           "type": "string"
         },
         "customerDomain": {
@@ -731,7 +731,7 @@
           "type": "string"
         },
         "customerType": {
-          "description": "The type of the customer (DOMAIN or TEAM), default is DOMAIN.",
+          "description": "Identifies the type of the customer. Acceptable values include: * `domain`: Implies a domain-verified customer (default). * `team`: Implies an email-verified customer. For more information, see [managed teams](https://support.google.com/a/users/answer/9939479).",
           "enum": [
             "CUSTOMER_TYPE_UNSPECIFIED",
             "DOMAIN",
@@ -739,8 +739,8 @@
           ],
           "enumDescriptions": [
             "Customer type not known",
-            "Domained or domain owning customers",
-            "Domainless customers"
+            "Domained or domain-owning customers",
+            "Domainless or email-verified customers"
           ],
           "type": "string"
         },
@@ -773,7 +773,7 @@
       "id": "PrimaryAdmin",
       "properties": {
         "primaryEmail": {
-          "description": "Primary admin's domained email This email's domain will be used to create TEAM customer",
+          "description": "The business email of the primary administrator of the customer. The email verification link is sent to this email address at the time of customer creation. Primary administrators have access to the customer's Admin Console, including the ability to invite and evict users and manage the administrative needs of the customer.",
           "type": "string"
         }
       },
@@ -954,7 +954,7 @@
           "description": "Read-only transfer related information for the subscription. For more information, see retrieve transferable subscriptions for a customer.",
           "properties": {
             "currentLegacySkuId": {
-              "description": "Sku id of the current resold subscription. This is populated only when customer has subscription with legacy sku and the subscription resource is populated with recommeded sku for transfer in.",
+              "description": "The `skuId` of the current resold subscription. This is populated only when the customer has a subscription with a legacy SKU and the subscription resource is populated with the `skuId` of the SKU recommended for the transfer.",
               "type": "string"
             },
             "minimumTransferableSeats": {
diff --git a/googleapiclient/discovery_cache/documents/resourcesettings.v1.json b/googleapiclient/discovery_cache/documents/resourcesettings.v1.json
index f1df2d1..8e21d08 100644
--- a/googleapiclient/discovery_cache/documents/resourcesettings.v1.json
+++ b/googleapiclient/discovery_cache/documents/resourcesettings.v1.json
@@ -499,7 +499,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://resourcesettings.googleapis.com/",
   "schemas": {
     "GoogleCloudResourcesettingsV1ListSettingsResponse": {
diff --git a/googleapiclient/discovery_cache/documents/retail.v2.json b/googleapiclient/discovery_cache/documents/retail.v2.json
index 3e75f5f..a8b3cc7 100644
--- a/googleapiclient/discovery_cache/documents/retail.v2.json
+++ b/googleapiclient/discovery_cache/documents/retail.v2.json
@@ -111,6 +111,88 @@
           "resources": {
             "catalogs": {
               "methods": {
+                "completeQuery": {
+                  "description": "Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery",
+                  "httpMethod": "GET",
+                  "id": "retail.projects.locations.catalogs.completeQuery",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "Required. Catalog for which the completion is performed. Full resource name of catalog, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "dataset": {
+                      "description": "Determines which dataset to use for fetching completion. \"user-data\" will use the imported dataset through ImportCompletionData. \"cloud-retail\" will use the dataset generated by cloud retail based on user events. If leave empty, it will use the \"user-data\". Current supported values: * user-data * cloud-retail This option is not automatically enabled. Before using cloud-retail, contact retail-search-support@google.com first.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "deviceType": {
+                      "description": "The device type context for completion suggestions. It is useful to apply different suggestions on different device types, e.g. DESKTOP, MOBILE. If it is empty, the suggestions are across all device types. Supported formats: * UNKNOWN_DEVICE_TYPE * DESKTOP * MOBILE * A customized string starts with OTHER_, e.g. OTHER_IPHONE.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "languageCodes": {
+                      "description": "The list of languages of the query. This is the BCP-47 language code, such as \"en-US\" or \"sr-Latn\". For more information, see [Tags for Identifying Languages](https://tools.ietf.org/html/bcp47). The maximum number of allowed characters is 255. Only \"en-US\" is currently supported.",
+                      "location": "query",
+                      "repeated": true,
+                      "type": "string"
+                    },
+                    "maxSuggestions": {
+                      "description": "Completion max suggestions. The maximum allowed max suggestions is 20. The default value is 20.",
+                      "format": "int32",
+                      "location": "query",
+                      "type": "integer"
+                    },
+                    "query": {
+                      "description": "Required. The query used to generate suggestions. The maximum number of allowed characters is 255.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "visitorId": {
+                      "description": "A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+                      "location": "query",
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2/{+catalog}:completeQuery",
+                  "response": {
+                    "$ref": "GoogleCloudRetailV2CompleteQueryResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
+                "getDefaultBranch": {
+                  "description": "Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch",
+                  "httpMethod": "GET",
+                  "id": "retail.projects.locations.catalogs.getDefaultBranch",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "The parent catalog resource name, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2/{+catalog}:getDefaultBranch",
+                  "response": {
+                    "$ref": "GoogleCloudRetailV2GetDefaultBranchResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
                 "list": {
                   "description": "Lists all the Catalogs associated with the project.",
                   "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs",
@@ -180,6 +262,34 @@
                   "scopes": [
                     "https://www.googleapis.com/auth/cloud-platform"
                   ]
+                },
+                "setDefaultBranch": {
+                  "description": "Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using \"default_branch\" to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch",
+                  "httpMethod": "POST",
+                  "id": "retail.projects.locations.catalogs.setDefaultBranch",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "Full resource name of the catalog, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2/{+catalog}:setDefaultBranch",
+                  "request": {
+                    "$ref": "GoogleCloudRetailV2SetDefaultBranchRequest"
+                  },
+                  "response": {
+                    "$ref": "GoogleProtobufEmpty"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
                 }
               },
               "resources": {
@@ -216,6 +326,34 @@
                     },
                     "products": {
                       "methods": {
+                        "addFulfillmentPlaces": {
+                          "description": "Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces",
+                          "parameterOrder": [
+                            "product"
+                          ],
+                          "parameters": {
+                            "product": {
+                              "description": "Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2/{+product}:addFulfillmentPlaces",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2AddFulfillmentPlacesRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
                         "create": {
                           "description": "Creates a Product.",
                           "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products",
@@ -327,6 +465,53 @@
                             "https://www.googleapis.com/auth/cloud-platform"
                           ]
                         },
+                        "list": {
+                          "description": "Gets a list of Products.",
+                          "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products",
+                          "httpMethod": "GET",
+                          "id": "retail.projects.locations.catalogs.branches.products.list",
+                          "parameterOrder": [
+                            "parent"
+                          ],
+                          "parameters": {
+                            "filter": {
+                              "description": "A filter to apply on the list results. Supported features: * List all the products under the parent branch if filter is unset. * List Product.Type.VARIANT Products sharing the same Product.Type.PRIMARY Product. For example: `primary_product_id = \"some_product_id\"` * List Products bundled in a Product.Type.COLLECTION Product. For example: `collection_product_id = \"some_product_id\"` * List Products with a partibular type. For example: `type = \"PRIMARY\"` `type = \"VARIANT\"` `type = \"COLLECTION\"` If the field is unrecognizable, an INVALID_ARGUMENT error is returned. If the specified Product.Type.PRIMARY Product or Product.Type.COLLECTION Product does not exist, a NOT_FOUND error is returned.",
+                              "location": "query",
+                              "type": "string"
+                            },
+                            "pageSize": {
+                              "description": "Maximum number of Products to return. If unspecified, defaults to 100. The maximum allowed value is 1000. Values above 1000 will be coerced to 1000. If this field is negative, an INVALID_ARGUMENT error is returned.",
+                              "format": "int32",
+                              "location": "query",
+                              "type": "integer"
+                            },
+                            "pageToken": {
+                              "description": "A page token ListProductsResponse.next_page_token, received from a previous ProductService.ListProducts call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to ProductService.ListProducts must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.",
+                              "location": "query",
+                              "type": "string"
+                            },
+                            "parent": {
+                              "description": "Required. The parent branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use `default_branch` as the branch ID, to list products under the default branch. If the caller does not have permission to list Products under this branch, regardless of whether or not this branch exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+$",
+                              "required": true,
+                              "type": "string"
+                            },
+                            "readMask": {
+                              "description": "The fields of Product to return in the responses. If not set or empty, the following fields are returned: * Product.name * Product.id * Product.title * Product.uri * Product.images * Product.price_info * Product.brands If \"*\" is provided, all fields are returned. Product.name is always returned no matter what mask is set. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned.",
+                              "format": "google-fieldmask",
+                              "location": "query",
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2/{+parent}/products",
+                          "response": {
+                            "$ref": "GoogleCloudRetailV2ListProductsResponse"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
                         "patch": {
                           "description": "Updates a Product.",
                           "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}",
@@ -365,11 +550,99 @@
                           "scopes": [
                             "https://www.googleapis.com/auth/cloud-platform"
                           ]
+                        },
+                        "removeFulfillmentPlaces": {
+                          "description": "Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces",
+                          "parameterOrder": [
+                            "product"
+                          ],
+                          "parameters": {
+                            "product": {
+                              "description": "Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2/{+product}:removeFulfillmentPlaces",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2RemoveFulfillmentPlacesRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
+                        "setInventory": {
+                          "description": "Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.setInventory",
+                          "parameterOrder": [
+                            "name"
+                          ],
+                          "parameters": {
+                            "name": {
+                              "description": "Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be \"default_branch\".",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2/{+name}:setInventory",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2SetInventoryRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
                         }
                       }
                     }
                   }
                 },
+                "completionData": {
+                  "methods": {
+                    "import": {
+                      "description": "Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                      "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import",
+                      "httpMethod": "POST",
+                      "id": "retail.projects.locations.catalogs.completionData.import",
+                      "parameterOrder": [
+                        "parent"
+                      ],
+                      "parameters": {
+                        "parent": {
+                          "description": "Required. The catalog which the suggestions dataset belongs to. Format: `projects/1234/locations/global/catalogs/default_catalog`.",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v2/{+parent}/completionData:import",
+                      "request": {
+                        "$ref": "GoogleCloudRetailV2ImportCompletionDataRequest"
+                      },
+                      "response": {
+                        "$ref": "GoogleLongrunningOperation"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
+                    }
+                  }
+                },
                 "operations": {
                   "methods": {
                     "get": {
@@ -469,6 +742,34 @@
                       "scopes": [
                         "https://www.googleapis.com/auth/cloud-platform"
                       ]
+                    },
+                    "search": {
+                      "description": "Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                      "flatPath": "v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search",
+                      "httpMethod": "POST",
+                      "id": "retail.projects.locations.catalogs.placements.search",
+                      "parameterOrder": [
+                        "placement"
+                      ],
+                      "parameters": {
+                        "placement": {
+                          "description": "Required. The resource name of the search engine placement, such as `projects/*/locations/global/catalogs/default_catalog/placements/default_search`. This field is used to identify the set of models that will be used to make the search. We currently support one placement with the following ID: * `default_search`.",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/placements/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v2/{+placement}:search",
+                      "request": {
+                        "$ref": "GoogleCloudRetailV2SearchRequest"
+                      },
+                      "response": {
+                        "$ref": "GoogleCloudRetailV2SearchResponse"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
                     }
                   }
                 },
@@ -706,7 +1007,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210723",
   "rootUrl": "https://retail.googleapis.com/",
   "schemas": {
     "GoogleApiHttpBody": {
@@ -859,12 +1160,72 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2AddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2AddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2AddFulfillmentPlacesRequest": {
+      "description": "Request message for AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2AddFulfillmentPlacesRequest",
+      "properties": {
+        "addTime": {
+          "description": "The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "allowMissing": {
+          "description": "If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "placeIds": {
+          "description": "Required. The IDs for this type, such as the store IDs for \"pickup-in-store\" or the region IDs for \"same-day-delivery\" to be added for this type. Duplicate IDs will be automatically ignored. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned. If the total number of place IDs exceeds 2000 for this type after adding, then the update will be rejected.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "type": {
+          "description": "Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2AddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2AddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2Audience": {
+      "description": "An intended audience of the Product for whom it's sold.",
+      "id": "GoogleCloudRetailV2Audience",
+      "properties": {
+        "ageGroups": {
+          "description": "The age groups of the audience. Strongly encouraged to use the standard values: \"newborn\" (up to 3 months old), \"infant\" (3\u201312 months old), \"toddler\" (1\u20135 years old), \"kids\" (5\u201313 years old), \"adult\" (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "genders": {
+          "description": "The genders of the audience. Strongly encouraged to use the standard values: \"male\", \"female\", \"unisex\". At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2BigQuerySource": {
       "description": "BigQuery source import data from.",
       "id": "GoogleCloudRetailV2BigQuerySource",
       "properties": {
         "dataSchema": {
-          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.",
+          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.",
           "type": "string"
         },
         "datasetId": {
@@ -875,6 +1236,10 @@
           "description": "Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.",
           "type": "string"
         },
+        "partitionDate": {
+          "$ref": "GoogleTypeDate",
+          "description": "BigQuery time partitioned table's _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`."
+        },
         "projectId": {
           "description": "The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.",
           "type": "string"
@@ -905,10 +1270,120 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2ColorInfo": {
+      "description": "The color information of a Product.",
+      "id": "GoogleCloudRetailV2ColorInfo",
+      "properties": {
+        "colorFamilies": {
+          "description": "The standard color families. Strongly recommended to use the following standard color groups: \"Red\", \"Pink\", \"Orange\", \"Yellow\", \"Purple\", \"Green\", \"Cyan\", \"Blue\", \"Brown\", \"White\", \"Gray\", \"Black\" and \"Mixed\". Normally it is expected to have only 1 color family. May consider using single \"Mixed\" instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "colors": {
+          "description": "The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single \"Mixed\" instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2CompleteQueryResponse": {
+      "description": "Response of the auto-complete query.",
+      "id": "GoogleCloudRetailV2CompleteQueryResponse",
+      "properties": {
+        "attributionToken": {
+          "description": "A unique complete token. This should be included in the SearchRequest resulting from this completion, which enables accurate attribution of complete model performance.",
+          "type": "string"
+        },
+        "completionResults": {
+          "description": "Results of the matching suggestions. The result list is ordered and the first result is top suggestion.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2CompleteQueryResponseCompletionResult"
+          },
+          "type": "array"
+        },
+        "recentSearchResults": {
+          "description": "Matched recent searches of this user. This field is a restricted feature. Contact Retail Support (retail-search-support@google.com) if you are interested in enabling it. This feature is only available when CompleteQueryRequest.visitor_id field is set and UserEvent is imported. The recent searches satisfy the follow rules: * They are ordered from latest to oldest. * They are matched with CompleteQueryRequest.query case insensitively. * They are transformed to lower cases. * They are UTF-8 safe. Recent searches are deduplicated. More recent searches will be reserved when duplication happens.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2CompleteQueryResponseRecentSearchResult"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2CompleteQueryResponseCompletionResult": {
+      "description": "Resource that represents completion results.",
+      "id": "GoogleCloudRetailV2CompleteQueryResponseCompletionResult",
+      "properties": {
+        "attributes": {
+          "additionalProperties": {
+            "$ref": "GoogleCloudRetailV2CustomAttribute"
+          },
+          "description": "Additional custom attributes ingested through BigQuery.",
+          "type": "object"
+        },
+        "suggestion": {
+          "description": "The suggestion for the query.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2CompleteQueryResponseRecentSearchResult": {
+      "description": "Recent search of this user.",
+      "id": "GoogleCloudRetailV2CompleteQueryResponseRecentSearchResult",
+      "properties": {
+        "recentSearch": {
+          "description": "The recent search query.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2CompletionDataInputConfig": {
+      "description": "The input config source for completion data.",
+      "id": "GoogleCloudRetailV2CompletionDataInputConfig",
+      "properties": {
+        "bigQuerySource": {
+          "$ref": "GoogleCloudRetailV2BigQuerySource",
+          "description": "Required. BigQuery input source. Add the IAM permission \u201cBigQuery Data Viewer\u201d for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown."
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2CompletionDetail": {
+      "description": "Detailed completion information including completion attribution token and clicked completion info.",
+      "id": "GoogleCloudRetailV2CompletionDetail",
+      "properties": {
+        "completionAttributionToken": {
+          "description": "Completion attribution token in CompleteQueryResponse.attribution_token.",
+          "type": "string"
+        },
+        "selectedPosition": {
+          "description": "End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "selectedSuggestion": {
+          "description": "End user selected CompleteQueryResponse.CompletionResult.suggestion.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2CustomAttribute": {
       "description": "A custom attribute that is not explicitly modeled in Product.",
       "id": "GoogleCloudRetailV2CustomAttribute",
       "properties": {
+        "indexable": {
+          "description": "If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.",
+          "type": "boolean"
+        },
         "numbers": {
           "description": "The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is \"lengths_cm\". At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -917,6 +1392,10 @@
           },
           "type": "array"
         },
+        "searchable": {
+          "description": "If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.",
+          "type": "boolean"
+        },
         "text": {
           "description": "The textual values of this custom attribute. For example, `[\"yellow\", \"green\"]` when the key is \"color\". At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -927,12 +1406,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2FulfillmentInfo": {
+      "description": "Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.",
+      "id": "GoogleCloudRetailV2FulfillmentInfo",
+      "properties": {
+        "placeIds": {
+          "description": "The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "type": {
+          "description": "The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2GcsSource": {
       "description": "Google Cloud Storage location for input content. format.",
       "id": "GoogleCloudRetailV2GcsSource",
       "properties": {
         "dataSchema": {
-          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.",
+          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.",
           "type": "string"
         },
         "inputUris": {
@@ -945,6 +1442,26 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2GetDefaultBranchResponse": {
+      "description": "Response message of CatalogService.GetDefaultBranch.",
+      "id": "GoogleCloudRetailV2GetDefaultBranchResponse",
+      "properties": {
+        "branch": {
+          "description": "Full resource name of the branch id currently set as default branch.",
+          "type": "string"
+        },
+        "note": {
+          "description": "This corresponds to SetDefaultBranchRequest.note field, when this branch was set as default.",
+          "type": "string"
+        },
+        "setTime": {
+          "description": "The time when this branch is set to default.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2Image": {
       "description": "Product thumbnail/detail image.",
       "id": "GoogleCloudRetailV2Image",
@@ -966,6 +1483,35 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2ImportCompletionDataRequest": {
+      "description": "Request message for ImportCompletionData methods.",
+      "id": "GoogleCloudRetailV2ImportCompletionDataRequest",
+      "properties": {
+        "inputConfig": {
+          "$ref": "GoogleCloudRetailV2CompletionDataInputConfig",
+          "description": "Required. The desired input location of the data."
+        },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2ImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2ImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2ImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2ImportErrorsConfig",
@@ -991,6 +1537,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -1016,6 +1570,28 @@
           "$ref": "GoogleCloudRetailV2ProductInputConfig",
           "description": "Required. The desired input location of the data."
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.",
+          "type": "string"
+        },
+        "reconciliationMode": {
+          "description": "The mode of reconciliation between existing products and the products to be imported. Defaults to ReconciliationMode.INCREMENTAL.",
+          "enum": [
+            "RECONCILIATION_MODE_UNSPECIFIED",
+            "INCREMENTAL",
+            "FULL"
+          ],
+          "enumDescriptions": [
+            "Defaults to INCREMENTAL.",
+            "Inserts new products or updates existing products.",
+            "Calculates diff and replaces the entire product dataset. Existing products may be deleted if they are not present in the source location. Can only be while using BigQuerySource. Add the IAM permission \u201cBigQuery Data Viewer\u201d for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search."
+          ],
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Unique identifier provided by client, within the ancestor dataset scope. Ensures idempotency and used for request deduplication. Server-generated if unspecified. Up to 128 characters long and must match the pattern: \"[a-zA-Z0-9_]+\". This is returned as Operation.name in ImportMetadata. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.",
+          "type": "string"
+        },
         "updateMask": {
           "description": "Indicates which fields in the provided imported 'products' to update. If not set, will by default update all fields.",
           "format": "google-fieldmask",
@@ -1079,6 +1655,33 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2Interval": {
+      "description": "A floating point interval.",
+      "id": "GoogleCloudRetailV2Interval",
+      "properties": {
+        "exclusiveMaximum": {
+          "description": "Exclusive upper bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "exclusiveMinimum": {
+          "description": "Exclusive lower bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "maximum": {
+          "description": "Inclusive upper bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "minimum": {
+          "description": "Inclusive lower bound.",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2ListCatalogsResponse": {
       "description": "Response for CatalogService.ListCatalogs method.",
       "id": "GoogleCloudRetailV2ListCatalogsResponse",
@@ -1097,6 +1700,24 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2ListProductsResponse": {
+      "description": "Response message for ProductService.ListProducts method.",
+      "id": "GoogleCloudRetailV2ListProductsResponse",
+      "properties": {
+        "nextPageToken": {
+          "description": "A token that can be sent as ListProductsRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.",
+          "type": "string"
+        },
+        "products": {
+          "description": "The Products.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2Product"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2PredictRequest": {
       "description": "Request message for Predict method.",
       "id": "GoogleCloudRetailV2PredictRequest",
@@ -1196,7 +1817,7 @@
           "type": "number"
         },
         "currencyCode": {
-          "description": "The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.",
+          "description": "The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.",
           "type": "string"
         },
         "originalPrice": {
@@ -1208,6 +1829,36 @@
           "description": "Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).",
           "format": "float",
           "type": "number"
+        },
+        "priceEffectiveTime": {
+          "description": "The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "priceExpireTime": {
+          "description": "The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "priceRange": {
+          "$ref": "GoogleCloudRetailV2PriceInfoPriceRange",
+          "description": "Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.",
+          "readOnly": true
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2PriceInfoPriceRange": {
+      "description": "The price range of all variant Product having the same Product.primary_product_id.",
+      "id": "GoogleCloudRetailV2PriceInfoPriceRange",
+      "properties": {
+        "originalPrice": {
+          "$ref": "GoogleCloudRetailV2Interval",
+          "description": "The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id."
+        },
+        "price": {
+          "$ref": "GoogleCloudRetailV2Interval",
+          "description": "The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id."
         }
       },
       "type": "object"
@@ -1220,9 +1871,13 @@
           "additionalProperties": {
             "$ref": "GoogleCloudRetailV2CustomAttribute"
           },
-          "description": "Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ \"vendor\": {\"text\": [\"vendor123\", \"vendor456\"]}, \"lengths_cm\": {\"numbers\":[2.3, 15.4]}, \"heights_cm\": {\"numbers\":[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.",
+          "description": "Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ \"vendor\": {\"text\": [\"vendor123\", \"vendor456\"]}, \"lengths_cm\": {\"numbers\":[2.3, 15.4]}, \"heights_cm\": {\"numbers\":[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.",
           "type": "object"
         },
+        "audience": {
+          "$ref": "GoogleCloudRetailV2Audience",
+          "description": "The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product."
+        },
         "availability": {
           "description": "The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).",
           "enum": [
@@ -1247,10 +1902,17 @@
           "type": "integer"
         },
         "availableTime": {
-          "description": "The timestamp when this Product becomes available for recommendation.",
+          "description": "The timestamp when this Product becomes available for SearchService.Search.",
           "format": "google-datetime",
           "type": "string"
         },
+        "brands": {
+          "description": "The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "categories": {
           "description": "Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [\"Shoes & Accessories\" -> \"Shoes\"] and [\"Sports & Fitness\" -> \"Athletic Clothing\" -> \"Shoes\"], it could be represented as: \"categories\": [ \"Shoes & Accessories > Shoes\", \"Sports & Fitness > Athletic Clothing > Shoes\" ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436",
           "items": {
@@ -1258,10 +1920,44 @@
           },
           "type": "array"
         },
+        "collectionMemberIds": {
+          "description": "The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "colorInfo": {
+          "$ref": "GoogleCloudRetailV2ColorInfo",
+          "description": "The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color)."
+        },
+        "conditions": {
+          "description": "The condition of the product. Strongly encouraged to use the standard values: \"new\", \"refurbished\", \"used\". A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "description": {
           "description": "Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).",
           "type": "string"
         },
+        "expireTime": {
+          "description": "The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "fulfillmentInfo": {
+          "description": "Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2FulfillmentInfo"
+          },
+          "type": "array"
+        },
+        "gtin": {
+          "description": "The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
         "id": {
           "description": "Immutable. Product identifier, which is the final component of name. For example, this field is \"id_1\", if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).",
           "type": "string"
@@ -1273,10 +1969,28 @@
           },
           "type": "array"
         },
+        "languageCode": {
+          "description": "Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to \"en-US\" if unset.",
+          "type": "string"
+        },
+        "materials": {
+          "description": "The material of the product. For example, \"leather\", \"wooden\". A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "name": {
           "description": "Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be \"default_branch\".",
           "type": "string"
         },
+        "patterns": {
+          "description": "The pattern or graphic print of the product. For example, \"striped\", \"polka dot\", \"paisley\". A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "priceInfo": {
           "$ref": "GoogleCloudRetailV2PriceInfo",
           "description": "Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371)."
@@ -1285,6 +1999,34 @@
           "description": "Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).",
           "type": "string"
         },
+        "promotions": {
+          "description": "The promotions applied to the product. A maximum of 10 values are allowed per Product.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2Promotion"
+          },
+          "type": "array"
+        },
+        "publishTime": {
+          "description": "The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "rating": {
+          "$ref": "GoogleCloudRetailV2Rating",
+          "description": "The rating of this product."
+        },
+        "retrievableFields": {
+          "description": "Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form \"attributes.key\" where \"key\" is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "google-fieldmask",
+          "type": "string"
+        },
+        "sizes": {
+          "description": "The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in \"US:MENS:M\", \"US\" represents size system; \"MENS\" represents size type; \"M\" represents size value. In \"GIRLS:27\", size system is empty; \"GIRLS\" represents size type; \"27\" represents size value. In \"32 inches\", both size system and size type are empty, while size value is \"32 inches\". A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "tags": {
           "description": "Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0\u20134](https://support.google.com/merchants/answer/6324473).",
           "items": {
@@ -1296,6 +2038,11 @@
           "description": "Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).",
           "type": "string"
         },
+        "ttl": {
+          "description": "Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.",
+          "format": "google-duration",
+          "type": "string"
+        },
         "type": {
           "description": "Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.",
           "enum": [
@@ -1315,6 +2062,14 @@
         "uri": {
           "description": "Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).",
           "type": "string"
+        },
+        "variants": {
+          "description": "Output only. Product variants grouped together on primary product which share similar product attributes. It's automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2Product"
+          },
+          "readOnly": true,
+          "type": "array"
         }
       },
       "type": "object"
@@ -1383,6 +2138,17 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2Promotion": {
+      "description": "Promotion information.",
+      "id": "GoogleCloudRetailV2Promotion",
+      "properties": {
+        "promotionId": {
+          "description": "ID of the promotion. For example, \"free gift\". The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2PurchaseTransaction": {
       "description": "A transaction represents the entire purchase transaction.",
       "id": "GoogleCloudRetailV2PurchaseTransaction",
@@ -1446,6 +2212,31 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2Rating": {
+      "description": "The rating of a Product.",
+      "id": "GoogleCloudRetailV2Rating",
+      "properties": {
+        "averageRating": {
+          "description": "The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "float",
+          "type": "number"
+        },
+        "ratingCount": {
+          "description": "The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "ratingHistogram": {
+          "description": "List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.",
+          "items": {
+            "format": "int32",
+            "type": "integer"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2RejoinUserEventsMetadata": {
       "description": "Metadata for RejoinUserEvents method.",
       "id": "GoogleCloudRetailV2RejoinUserEventsMetadata",
@@ -1485,6 +2276,459 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2RemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2RemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2RemoveFulfillmentPlacesRequest": {
+      "description": "Request message for RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2RemoveFulfillmentPlacesRequest",
+      "properties": {
+        "allowMissing": {
+          "description": "If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "placeIds": {
+          "description": "Required. The IDs for this type, such as the store IDs for \"pickup-in-store\" or the region IDs for \"same-day-delivery\", to be removed for this type. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "removeTime": {
+          "description": "The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "type": {
+          "description": "Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2RemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2RemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchRequest": {
+      "description": "Request message for SearchService.Search method.",
+      "id": "GoogleCloudRetailV2SearchRequest",
+      "properties": {
+        "boostSpec": {
+          "$ref": "GoogleCloudRetailV2SearchRequestBoostSpec",
+          "description": "Boost specification to boost certain products. See more details at this [user guide](/retail/private/docs/boosting)."
+        },
+        "branch": {
+          "description": "The branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use \"default_branch\" as the branch ID or leave this field empty, to search products under the default branch.",
+          "type": "string"
+        },
+        "canonicalFilter": {
+          "description": "The filter applied to every search request when quality improvement such as query expansion is needed. For example, if a query does not have enough results, an expanded query with SearchRequest.canonical_filter will be returned as a supplement of the original query. This field is strongly recommended to achieve high search quality. See SearchRequest.filter for more details about filter syntax.",
+          "type": "string"
+        },
+        "dynamicFacetSpec": {
+          "$ref": "GoogleCloudRetailV2SearchRequestDynamicFacetSpec",
+          "description": "The specification for dynamically generated facets. Notice that only textual facets can be dynamically generated. This feature requires additional allowlisting. Contact Retail Support (retail-search-support@google.com) if you are interested in using dynamic facet feature."
+        },
+        "facetSpecs": {
+          "description": "Facet specifications for faceted search. If empty, no facets are returned. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2SearchRequestFacetSpec"
+          },
+          "type": "array"
+        },
+        "filter": {
+          "description": "The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. Filter expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#filter). If this field is unrecognizable, an INVALID_ARGUMENT is returned.",
+          "type": "string"
+        },
+        "offset": {
+          "description": "A 0-indexed integer that specifies the current offset (that is, starting result location, amongst the Products deemed by the API as relevant) in search results. This field is only considered if page_token is unset. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "orderBy": {
+          "description": "The order in which products are returned. Products can be ordered by a field in an Product object. Leave it unset if ordered by relevance. OrderBy expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#order). If this field is unrecognizable, an INVALID_ARGUMENT is returned.",
+          "type": "string"
+        },
+        "pageCategories": {
+          "description": "The categories associated with a category page. Required for category navigation queries to achieve good search quality. The format should be the same as UserEvent.page_categories; To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: \"pageCategories\" : [\"Sales > 2017 Black Friday Deals\"].",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "pageSize": {
+          "description": "Maximum number of Products to return. If unspecified, defaults to a reasonable value. The maximum allowed value is 120. Values above 120 will be coerced to 120. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "pageToken": {
+          "description": "A page token SearchResponse.next_page_token, received from a previous SearchService.Search call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to SearchService.Search must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "query": {
+          "description": "Raw search query.",
+          "type": "string"
+        },
+        "queryExpansionSpec": {
+          "$ref": "GoogleCloudRetailV2SearchRequestQueryExpansionSpec",
+          "description": "The query expansion specification that specifies the conditions under which query expansion will occur. See more details at this [user guide](/retail/private/docs/result-size#query_expansion)."
+        },
+        "userInfo": {
+          "$ref": "GoogleCloudRetailV2UserInfo",
+          "description": "User information."
+        },
+        "variantRollupKeys": {
+          "description": "The keys to fetch and rollup the matching variant Products attributes. The attributes from all the matching variant Products are merged and de-duplicated. Notice that rollup variant Products attributes will lead to extra query latency. Maximum number of keys is 10. For Product.fulfillment_info, a fulfillment type and a fulfillment ID must be provided in the format of \"fulfillmentType.filfillmentId\". E.g., in \"pickupInStore.store123\", \"pickupInStore\" is fulfillment type and \"store123\" is the store ID. Supported keys are: * colorFamilies * price * originalPrice * discount * attributes.key, where key is any key in the Product.attributes map. * pickupInStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.PICKUP_IN_STORE. * shipToStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SHIP_TO_STORE. * sameDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SAME_DAY_DELIVERY. * nextDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * customFulfillment1.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_1. * customFulfillment2.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_2. * customFulfillment3.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_3. * customFulfillment4.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_4. * customFulfillment5.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_5. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "visitorId": {
+          "description": "Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchRequestBoostSpec": {
+      "description": "Boost specification to boost certain items.",
+      "id": "GoogleCloudRetailV2SearchRequestBoostSpec",
+      "properties": {
+        "conditionBoostSpecs": {
+          "description": "Condition boost specifications. If a product matches multiple conditions in the specifictions, boost scores from these specifications are all applied and combined in a non-linear way. Maximum number of specifications is 10.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2SearchRequestBoostSpecConditionBoostSpec"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchRequestBoostSpecConditionBoostSpec": {
+      "description": "Boost applies to products which match a condition.",
+      "id": "GoogleCloudRetailV2SearchRequestBoostSpecConditionBoostSpec",
+      "properties": {
+        "boost": {
+          "description": "Strength of the condition boost, which should be in [-1, 1]. Negative boost means demotion. Default is 0.0. Setting to 1.0 gives the item a big promotion. However, it does not necessarily mean that the boosted item will be the top result at all times, nor that other items will be excluded. Results could still be shown even when none of them matches the condition. And results that are significantly more relevant to the search query can still trump your heavily favored but irrelevant items. Setting to -1.0 gives the item a big demotion. However, results that are deeply relevant might still be shown. The item will have an upstream battle to get a fairly high ranking, but it is not blocked out completely. Setting to 0.0 means no boost applied. The boosting condition is ignored.",
+          "format": "float",
+          "type": "number"
+        },
+        "condition": {
+          "description": "An expression which specifies a boost condition. The syntax and supported fields are the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Examples: * To boost products with product ID \"product_1\" or \"product_2\", and color \"Red\" or \"Blue\": *(id: ANY(\"product_1\", \"product_2\")) * *AND * *(colorFamilies: ANY(\"Red\", \"Blue\")) *",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchRequestDynamicFacetSpec": {
+      "description": "The specifications of dynamically generated facets.",
+      "id": "GoogleCloudRetailV2SearchRequestDynamicFacetSpec",
+      "properties": {
+        "mode": {
+          "description": "Mode of the DynamicFacet feature. Defaults to Mode.DISABLED if it's unset.",
+          "enum": [
+            "MODE_UNSPECIFIED",
+            "DISABLED",
+            "ENABLED"
+          ],
+          "enumDescriptions": [
+            "Default value.",
+            "Disable Dynamic Facet.",
+            "Automatic mode built by Google Retail Search."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchRequestFacetSpec": {
+      "description": "A facet specification to perform faceted search.",
+      "id": "GoogleCloudRetailV2SearchRequestFacetSpec",
+      "properties": {
+        "enableDynamicPosition": {
+          "description": "Enables dynamic position for this facet. If set to true, the position of this facet among all facets in the response is determined by Google Retail Search. It will be ordered together with dynamic facets if dynamic facets is enabled. If set to false, the position of this facet in the response will be the same as in the request, and it will be ranked before the facets with dynamic position enable and all dynamic facets. For example, you may always want to have rating facet returned in the response, but it's not necessarily to always display the rating facet at the top. In that case, you can set enable_dynamic_position to true so that the position of rating facet in response will be determined by Google Retail Search. Another example, assuming you have the following facets in the request: * \"rating\", enable_dynamic_position = true * \"price\", enable_dynamic_position = false * \"brands\", enable_dynamic_position = false And also you have a dynamic facets enable, which will generate a facet 'gender'. Then the final order of the facets in the response can be (\"price\", \"brands\", \"rating\", \"gender\") or (\"price\", \"brands\", \"gender\", \"rating\") depends on how Google Retail Search orders \"gender\" and \"rating\" facets. However, notice that \"price\" and \"brands\" will always be ranked at 1st and 2nd position since their enable_dynamic_position are false.",
+          "type": "boolean"
+        },
+        "excludedFilterKeys": {
+          "description": "List of keys to exclude when faceting. By default, FacetKey.key is not excluded from the filter unless it is listed in this field. For example, suppose there are 100 products with color facet \"Red\" and 200 products with color facet \"Blue\". A query containing the filter \"colorFamilies:ANY(\"Red\")\" and have \"colorFamilies\" as FacetKey.key will by default return the \"Red\" with count 100. If this field contains \"colorFamilies\", then the query returns both the \"Red\" with count 100 and \"Blue\" with count 200, because the \"colorFamilies\" key is now excluded from the filter. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "facetKey": {
+          "$ref": "GoogleCloudRetailV2SearchRequestFacetSpecFacetKey",
+          "description": "Required. The facet key specification."
+        },
+        "limit": {
+          "description": "Maximum of facet values that should be returned for this facet. If unspecified, defaults to 20. The maximum allowed value is 300. Values above 300 will be coerced to 300. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchRequestFacetSpecFacetKey": {
+      "description": "Specifies how a facet is computed.",
+      "id": "GoogleCloudRetailV2SearchRequestFacetSpecFacetKey",
+      "properties": {
+        "contains": {
+          "description": "Only get facet values that contains the given strings. For example, suppose \"categories\" has three values \"Women > Shoe\", \"Women > Dress\" and \"Men > Shoe\". If set \"contains\" to \"Shoe\", the \"categories\" facet will give only \"Women > Shoe\" and \"Men > Shoe\". Only supported on textual fields. Maximum is 10.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "intervals": {
+          "description": "Set only if values should be bucketized into intervals. Must be set for facets with numerical values. Must not be set for facet with text values. Maximum number of intervals is 30.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2Interval"
+          },
+          "type": "array"
+        },
+        "key": {
+          "description": "Required. Supported textual and numerical facet keys in Product object, over which the facet values are computed. Facet key is case-sensitive. Allowed facet keys when FacetKey.query is not specified: * textual_field = *# The Product.brands. * \"brands\"; *# The Product.categories. * \"categories\"; *# The Audience.genders. * | \"genders\"; *# The Audience.age_groups. * | \"ageGroups\"; *# The Product.availability. Value is one of * *# \"IN_STOCK\", \"OUT_OF_STOCK\", PREORDER\", \"BACKORDER\". * | \"availability\"; *# The ColorInfo.color_families. * | \"colorFamilies\"; *# The ColorInfo.colors. * | \"colors\"; *# The Product.sizes. * | \"sizes\"; *# The Product.materials. * | \"materials\"; *# The Product.patterns. * | \"patterns\"; *# The Product.conditions. * | \"conditions\"; *# The textual custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are textual. * *# map. * | \"attributes.key\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.PICKUP_IN_STORE. * | \"pickupInStore\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SHIP_TO_STORE. * | \"shipToStore\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SAME_DAY_DELIVERY. * | \"sameDayDelivery\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * | \"nextDayDelivery\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_1. * | \"customFulfillment1\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_2. * | \"customFulfillment2\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_3. * | \"customFulfillment3\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_4. * | \"customFulfillment4\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_5. * | \"customFulfillment5\"; * numerical_field = *# The PriceInfo.price. * \"price\"; *# The discount. Computed by (original_price-price)/price * \"discount\"; *# The Rating.average_rating. * \"rating\"; *# The Rating.rating_count. * \"ratingCount\"; *# The numerical custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are numerical. * | \"attributes.key\";",
+          "type": "string"
+        },
+        "orderBy": {
+          "description": "The order in which Facet.values are returned. Allowed values are: * \"count desc\", which means order by Facet.FacetValue.count descending. * \"value desc\", which means order by Facet.FacetValue.value descending. Only applies to textual facets. If not set, textual values are sorted in [natural order](https://en.wikipedia.org/wiki/Natural_sort_order); numerical intervals are sorted in the order given by FacetSpec.FacetKey.intervals; FulfillmentInfo.ids are sorted in the order given by FacetSpec.FacetKey.restricted_values.",
+          "type": "string"
+        },
+        "prefixes": {
+          "description": "Only get facet values that start with the given string prefix. For example, suppose \"categories\" has three values \"Women > Shoe\", \"Women > Dress\" and \"Men > Shoe\". If set \"prefixes\" to \"Women\", the \"categories\" facet will give only \"Women > Shoe\" and \"Women > Dress\". Only supported on textual fields. Maximum is 10.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "query": {
+          "description": "The query that is used to compute facet for the given facet key. When provided, it will override the default behavior of facet computation. The query syntax is the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Notice that there is no limitation on FacetKey.key when query is specified. In the response, FacetValue.value will be always \"1\" and FacetValue.count will be the number of results that matches the query. For example, you can set a customized facet for \"shipToStore\", where FacetKey.key is \"customizedShipToStore\", and FacetKey.query is \"availability: ANY(\\\"IN_STOCK\\\") AND shipToStore: ANY(\\\"123\\\")\". Then the facet will count the products that are both in stock and ship to store \"123\".",
+          "type": "string"
+        },
+        "restrictedValues": {
+          "description": "Only get facet for the given restricted values. For example, when using \"pickupInStore\" as key and set restricted values to [\"store123\", \"store456\"], only facets for \"store123\" and \"store456\" are returned. Only supported on textual fields and fulfillments. Maximum is 20. Must be set for the fulfillment facet keys: * pickupInStore * shipToStore * sameDayDelivery * nextDayDelivery * customFulfillment1 * customFulfillment2 * customFulfillment3 * customFulfillment4 * customFulfillment5",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchRequestQueryExpansionSpec": {
+      "description": "Specification to determine under which conditions query expansion should occur.",
+      "id": "GoogleCloudRetailV2SearchRequestQueryExpansionSpec",
+      "properties": {
+        "condition": {
+          "description": "The condition under which query expansion should occur. Default to Condition.DISABLED.",
+          "enum": [
+            "CONDITION_UNSPECIFIED",
+            "DISABLED",
+            "AUTO"
+          ],
+          "enumDescriptions": [
+            "Unspecified query expansion condition. This defaults to Condition.DISABLED.",
+            "Disabled query expansion. Only the exact search query is used, even if SearchResponse.total_size is zero.",
+            "Automatic query expansion built by Google Retail Search."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchResponse": {
+      "description": "Response message for SearchService.Search method.",
+      "id": "GoogleCloudRetailV2SearchResponse",
+      "properties": {
+        "attributionToken": {
+          "description": "A unique search token. This should be included in the UserEvent logs resulting from this search, which enables accurate attribution of search model performance.",
+          "type": "string"
+        },
+        "correctedQuery": {
+          "description": "If spell correction applies, the corrected query. Otherwise, empty.",
+          "type": "string"
+        },
+        "facets": {
+          "description": "Results of facets requested by user.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2SearchResponseFacet"
+          },
+          "type": "array"
+        },
+        "nextPageToken": {
+          "description": "A token that can be sent as SearchRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.",
+          "type": "string"
+        },
+        "queryExpansionInfo": {
+          "$ref": "GoogleCloudRetailV2SearchResponseQueryExpansionInfo",
+          "description": "Query expansion information for the returned results."
+        },
+        "redirectUri": {
+          "description": "The URI of a customer-defined redirect page. If redirect action is triggered, no search will be performed, and only redirect_uri and attribution_token will be set in the response.",
+          "type": "string"
+        },
+        "results": {
+          "description": "A list of matched items. The order represents the ranking.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2SearchResponseSearchResult"
+          },
+          "type": "array"
+        },
+        "totalSize": {
+          "description": "The estimated total count of matched items irrespective of pagination. The count of results returned by pagination may be less than the total_size that matches.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchResponseFacet": {
+      "description": "A facet result.",
+      "id": "GoogleCloudRetailV2SearchResponseFacet",
+      "properties": {
+        "dynamicFacet": {
+          "description": "Whether the facet is dynamically generated.",
+          "type": "boolean"
+        },
+        "key": {
+          "description": "The key for this facet. E.g., \"colorFamilies\" or \"price\" or \"attributes.attr1\".",
+          "type": "string"
+        },
+        "values": {
+          "description": "The facet values for this field.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2SearchResponseFacetFacetValue"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchResponseFacetFacetValue": {
+      "description": "A facet value which contains value names and their count.",
+      "id": "GoogleCloudRetailV2SearchResponseFacetFacetValue",
+      "properties": {
+        "count": {
+          "description": "Number of items that have this facet value.",
+          "format": "int64",
+          "type": "string"
+        },
+        "interval": {
+          "$ref": "GoogleCloudRetailV2Interval",
+          "description": "Interval value for a facet, such as [10, 20) for facet \"price\"."
+        },
+        "value": {
+          "description": "Text value of a facet, such as \"Black\" for facet \"colorFamilies\".",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchResponseQueryExpansionInfo": {
+      "description": "Information describing query expansion including whether expansion has occurred.",
+      "id": "GoogleCloudRetailV2SearchResponseQueryExpansionInfo",
+      "properties": {
+        "expandedQuery": {
+          "description": "Bool describing whether query expansion has occurred.",
+          "type": "boolean"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SearchResponseSearchResult": {
+      "description": "Represents the search results.",
+      "id": "GoogleCloudRetailV2SearchResponseSearchResult",
+      "properties": {
+        "id": {
+          "description": "Product.id of the searched Product.",
+          "type": "string"
+        },
+        "matchingVariantCount": {
+          "description": "The count of matched variant Products.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "matchingVariantFields": {
+          "additionalProperties": {
+            "format": "google-fieldmask",
+            "type": "string"
+          },
+          "description": "If a variant Product matches the search query, this map indicates which Product fields are matched. The key is the Product.name, the value is a field mask of the matched Product fields. If matched attributes cannot be determined, this map will be empty. For example, a key \"sku1\" with field mask \"products.color_info\" indicates there is a match between \"sku1\" ColorInfo and the query.",
+          "type": "object"
+        },
+        "product": {
+          "$ref": "GoogleCloudRetailV2Product",
+          "description": "The product data snippet in the search response. Only Product.name is guaranteed to be populated. Product.variants contains the product variants that match the search query. If there are multiple product variants matching the query, top 5 most relevant product variants are returned and ordered by relevancy. If relevancy can be deternmined, use matching_variant_fields to look up matched product variants fields. If relevancy cannot be determined, e.g. when searching \"shoe\" all products in a shoe product can be a match, 5 product variants are returned but order is meaningless."
+        },
+        "variantRollupValues": {
+          "additionalProperties": {
+            "type": "any"
+          },
+          "description": "The rollup matching variant Product attributes. The key is one of the SearchRequest.variant_rollup_keys. The values are the merged and de-duplicated Product attributes. Notice that the rollup values are respect filter. For example, when filtering by \"colorFamilies:ANY(\\\"red\\\")\" and rollup \"colorFamilies\", only \"red\" is returned. For textual and numerical attributes, the rollup values is a list of string or double values with type google.protobuf.ListValue. For example, if there are two variants with colors \"red\" and \"blue\", the rollup values are { key: \"colorFamilies\" value { list_value { values { string_value: \"red\" } values { string_value: \"blue\" } } } } For Product.fulfillment_info, the rollup values is a double value with type google.protobuf.Value. For example, {key: \"pickupInStore.store1\" value { number_value: 10 }} means a there are 10 variants in this product are available in the store \"store1\".",
+          "type": "object"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SetDefaultBranchRequest": {
+      "description": "Request message to set a specified branch as new default_branch.",
+      "id": "GoogleCloudRetailV2SetDefaultBranchRequest",
+      "properties": {
+        "branchId": {
+          "description": "The final component of the resource name of a branch. This field must be one of \"0\", \"1\" or \"2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "note": {
+          "description": "Some note on this request, this can be retrieved by CatalogService.GetDefaultBranch before next valid default branch set occurs. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2SetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SetInventoryRequest": {
+      "description": "Request message for SetInventory method.",
+      "id": "GoogleCloudRetailV2SetInventoryRequest",
+      "properties": {
+        "allowMissing": {
+          "description": "If set to true, and the Product with name Product.name is not found, the inventory update will still be processed and retained for at most 1 day until the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "inventory": {
+          "$ref": "GoogleCloudRetailV2Product",
+          "description": "Required. The inventory information to update. The allowable fields to update are: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info The updated inventory fields must be specified in SetInventoryRequest.set_mask. If SetInventoryRequest.inventory.name is empty or invalid, an INVALID_ARGUMENT error is returned. If the caller does not have permission to update the Product named in Product.name, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. If the Product to update does not have existing inventory information, the provided inventory information will be inserted. If the Product to update has existing inventory information, the provided inventory information will be merged while respecting the last update time for each inventory field, using the provided or default value for SetInventoryRequest.set_time. The last update time is recorded for the following inventory fields: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info If a full overwrite of inventory information while ignoring timestamps is needed, UpdateProduct should be invoked instead."
+        },
+        "setMask": {
+          "description": "Indicates which inventory fields in the provided Product to update. If not set or set with empty paths, all inventory fields will be updated. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned and the entire update will be ignored.",
+          "format": "google-fieldmask",
+          "type": "string"
+        },
+        "setTime": {
+          "description": "The time when the request is issued, used to prevent out-of-order updates on inventory fields with the last update time recorded. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2SetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2UserEvent": {
       "description": "UserEvent captures all metadata information Retail API needs to know about how end users interact with customers' website.",
       "id": "GoogleCloudRetailV2UserEvent",
@@ -1497,13 +2741,17 @@
           "type": "object"
         },
         "attributionToken": {
-          "description": "Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K's page. When recording events on product K's page, log the PredictResponse.attribution_token to this field.",
+          "description": "Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K's page. When recording events on product K's page, log the PredictResponse.attribution_token to this field.",
           "type": "string"
         },
         "cartId": {
           "description": "The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.",
           "type": "string"
         },
+        "completionDetail": {
+          "$ref": "GoogleCloudRetailV2CompletionDetail",
+          "description": "The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion."
+        },
         "eventTime": {
           "description": "Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.",
           "format": "google-datetime",
@@ -1520,6 +2768,19 @@
           },
           "type": "array"
         },
+        "filter": {
+          "description": "The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "offset": {
+          "description": "An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "orderBy": {
+          "description": "The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
         "pageCategories": {
           "description": "The categories associated with a category page. To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: \"pageCategories\" : [\"Sales > 2017 Black Friday Deals\"]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -1547,7 +2808,11 @@
           "type": "string"
         },
         "searchQuery": {
-          "description": "The user's search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "description": "The user's search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "sessionId": {
+          "description": "A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.",
           "type": "string"
         },
         "uri": {
@@ -1624,11 +2889,11 @@
           "type": "boolean"
         },
         "ipAddress": {
-          "description": "The end user's IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. \"104.133.9.80\") or an IPv6 address (e.g. \"2001:0db8:85a3:0000:0000:8a2e:0370:7334\"). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
+          "description": "The end user's IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. \"104.133.9.80\") or an IPv6 address (e.g. \"2001:0db8:85a3:0000:0000:8a2e:0370:7334\"). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
           "type": "string"
         },
         "userAgent": {
-          "description": "User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
+          "description": "User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
           "type": "string"
         },
         "userId": {
@@ -1638,6 +2903,18 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaAddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaAddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaAddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaAddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaExportErrorsConfig": {
       "description": "Configuration of destination for Export related errors.",
       "id": "GoogleCloudRetailV2alphaExportErrorsConfig",
@@ -1702,6 +2979,20 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2alphaImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2alphaImportErrorsConfig",
@@ -1727,6 +3018,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -1816,6 +3115,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2alphaSetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2alphaSetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaUserEventImportSummary": {
       "description": "A summary of import result. The UserEventImportSummary summarizes the import status for user events.",
       "id": "GoogleCloudRetailV2alphaUserEventImportSummary",
@@ -1833,6 +3156,18 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaAddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaAddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaAddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaAddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaExportErrorsConfig": {
       "description": "Configuration of destination for Export related errors.",
       "id": "GoogleCloudRetailV2betaExportErrorsConfig",
@@ -1897,6 +3232,20 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2betaImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2betaImportErrorsConfig",
@@ -1922,6 +3271,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -2011,6 +3368,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaRemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaRemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaRemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaRemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2betaSetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2betaSetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaUserEventImportSummary": {
       "description": "A summary of import result. The UserEventImportSummary summarizes the import status for user events.",
       "id": "GoogleCloudRetailV2betaUserEventImportSummary",
@@ -2113,6 +3494,28 @@
         }
       },
       "type": "object"
+    },
+    "GoogleTypeDate": {
+      "description": "Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.",
+      "id": "GoogleTypeDate",
+      "properties": {
+        "day": {
+          "description": "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "month": {
+          "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "year": {
+          "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
     }
   },
   "servicePath": "",
diff --git a/googleapiclient/discovery_cache/documents/retail.v2alpha.json b/googleapiclient/discovery_cache/documents/retail.v2alpha.json
index aa42ed6..a82ccaa 100644
--- a/googleapiclient/discovery_cache/documents/retail.v2alpha.json
+++ b/googleapiclient/discovery_cache/documents/retail.v2alpha.json
@@ -111,6 +111,88 @@
           "resources": {
             "catalogs": {
               "methods": {
+                "completeQuery": {
+                  "description": "Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery",
+                  "httpMethod": "GET",
+                  "id": "retail.projects.locations.catalogs.completeQuery",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "Required. Catalog for which the completion is performed. Full resource name of catalog, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "dataset": {
+                      "description": "Determines which dataset to use for fetching completion. \"user-data\" will use the imported dataset through ImportCompletionData. \"cloud-retail\" will use the dataset generated by cloud retail based on user events. If leave empty, it will use the \"user-data\". Current supported values: * user-data * cloud-retail This option is not automatically enabled. Before using cloud-retail, contact retail-search-support@google.com first.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "deviceType": {
+                      "description": "The device type context for completion suggestions. It is useful to apply different suggestions on different device types, e.g. DESKTOP, MOBILE. If it is empty, the suggestions are across all device types. Supported formats: * UNKNOWN_DEVICE_TYPE * DESKTOP * MOBILE * A customized string starts with OTHER_, e.g. OTHER_IPHONE.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "languageCodes": {
+                      "description": "The list of languages of the query. This is the BCP-47 language code, such as \"en-US\" or \"sr-Latn\". For more information, see [Tags for Identifying Languages](https://tools.ietf.org/html/bcp47). The maximum number of allowed characters is 255. Only \"en-US\" is currently supported.",
+                      "location": "query",
+                      "repeated": true,
+                      "type": "string"
+                    },
+                    "maxSuggestions": {
+                      "description": "Completion max suggestions. The maximum allowed max suggestions is 20. The default value is 20.",
+                      "format": "int32",
+                      "location": "query",
+                      "type": "integer"
+                    },
+                    "query": {
+                      "description": "Required. The query used to generate suggestions. The maximum number of allowed characters is 255.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "visitorId": {
+                      "description": "A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+                      "location": "query",
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2alpha/{+catalog}:completeQuery",
+                  "response": {
+                    "$ref": "GoogleCloudRetailV2alphaCompleteQueryResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
+                "getDefaultBranch": {
+                  "description": "Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch",
+                  "httpMethod": "GET",
+                  "id": "retail.projects.locations.catalogs.getDefaultBranch",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "The parent catalog resource name, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2alpha/{+catalog}:getDefaultBranch",
+                  "response": {
+                    "$ref": "GoogleCloudRetailV2alphaGetDefaultBranchResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
                 "list": {
                   "description": "Lists all the Catalogs associated with the project.",
                   "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs",
@@ -180,6 +262,34 @@
                   "scopes": [
                     "https://www.googleapis.com/auth/cloud-platform"
                   ]
+                },
+                "setDefaultBranch": {
+                  "description": "Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using \"default_branch\" to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch",
+                  "httpMethod": "POST",
+                  "id": "retail.projects.locations.catalogs.setDefaultBranch",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "Full resource name of the catalog, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2alpha/{+catalog}:setDefaultBranch",
+                  "request": {
+                    "$ref": "GoogleCloudRetailV2alphaSetDefaultBranchRequest"
+                  },
+                  "response": {
+                    "$ref": "GoogleProtobufEmpty"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
                 }
               },
               "resources": {
@@ -216,6 +326,34 @@
                     },
                     "products": {
                       "methods": {
+                        "addFulfillmentPlaces": {
+                          "description": "Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces",
+                          "parameterOrder": [
+                            "product"
+                          ],
+                          "parameters": {
+                            "product": {
+                              "description": "Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2alpha/{+product}:addFulfillmentPlaces",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2alphaAddFulfillmentPlacesRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
                         "create": {
                           "description": "Creates a Product.",
                           "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products",
@@ -327,6 +465,58 @@
                             "https://www.googleapis.com/auth/cloud-platform"
                           ]
                         },
+                        "list": {
+                          "description": "Gets a list of Products.",
+                          "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products",
+                          "httpMethod": "GET",
+                          "id": "retail.projects.locations.catalogs.branches.products.list",
+                          "parameterOrder": [
+                            "parent"
+                          ],
+                          "parameters": {
+                            "filter": {
+                              "description": "A filter to apply on the list results. Supported features: * List all the products under the parent branch if filter is unset. * List Product.Type.VARIANT Products sharing the same Product.Type.PRIMARY Product. For example: `primary_product_id = \"some_product_id\"` * List Products bundled in a Product.Type.COLLECTION Product. For example: `collection_product_id = \"some_product_id\"` * List Products with a partibular type. For example: `type = \"PRIMARY\"` `type = \"VARIANT\"` `type = \"COLLECTION\"` If the field is unrecognizable, an INVALID_ARGUMENT error is returned. If the specified Product.Type.PRIMARY Product or Product.Type.COLLECTION Product does not exist, a NOT_FOUND error is returned.",
+                              "location": "query",
+                              "type": "string"
+                            },
+                            "pageSize": {
+                              "description": "Maximum number of Products to return. If unspecified, defaults to 100. The maximum allowed value is 1000. Values above 1000 will be coerced to 1000. If this field is negative, an INVALID_ARGUMENT error is returned.",
+                              "format": "int32",
+                              "location": "query",
+                              "type": "integer"
+                            },
+                            "pageToken": {
+                              "description": "A page token ListProductsResponse.next_page_token, received from a previous ProductService.ListProducts call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to ProductService.ListProducts must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.",
+                              "location": "query",
+                              "type": "string"
+                            },
+                            "parent": {
+                              "description": "Required. The parent branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use `default_branch` as the branch ID, to list products under the default branch. If the caller does not have permission to list Products under this branch, regardless of whether or not this branch exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+$",
+                              "required": true,
+                              "type": "string"
+                            },
+                            "readMask": {
+                              "description": "The fields of Product to return in the responses. If not set or empty, the following fields are returned: * Product.name * Product.id * Product.title * Product.uri * Product.images * Product.price_info * Product.brands If \"*\" is provided, all fields are returned. Product.name is always returned no matter what mask is set. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned.",
+                              "format": "google-fieldmask",
+                              "location": "query",
+                              "type": "string"
+                            },
+                            "requireTotalSize": {
+                              "description": "If true and page_token is empty, ListProductsResponse.total_size is set to the total count of matched items irrespective of pagination. Notice that setting this field to true affects the performance.",
+                              "location": "query",
+                              "type": "boolean"
+                            }
+                          },
+                          "path": "v2alpha/{+parent}/products",
+                          "response": {
+                            "$ref": "GoogleCloudRetailV2alphaListProductsResponse"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
                         "patch": {
                           "description": "Updates a Product.",
                           "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}",
@@ -365,11 +555,99 @@
                           "scopes": [
                             "https://www.googleapis.com/auth/cloud-platform"
                           ]
+                        },
+                        "removeFulfillmentPlaces": {
+                          "description": "Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces",
+                          "parameterOrder": [
+                            "product"
+                          ],
+                          "parameters": {
+                            "product": {
+                              "description": "Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2alpha/{+product}:removeFulfillmentPlaces",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
+                        "setInventory": {
+                          "description": "Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.setInventory",
+                          "parameterOrder": [
+                            "name"
+                          ],
+                          "parameters": {
+                            "name": {
+                              "description": "Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be \"default_branch\".",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2alpha/{+name}:setInventory",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2alphaSetInventoryRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
                         }
                       }
                     }
                   }
                 },
+                "completionData": {
+                  "methods": {
+                    "import": {
+                      "description": "Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                      "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import",
+                      "httpMethod": "POST",
+                      "id": "retail.projects.locations.catalogs.completionData.import",
+                      "parameterOrder": [
+                        "parent"
+                      ],
+                      "parameters": {
+                        "parent": {
+                          "description": "Required. The catalog which the suggestions dataset belongs to. Format: `projects/1234/locations/global/catalogs/default_catalog`.",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v2alpha/{+parent}/completionData:import",
+                      "request": {
+                        "$ref": "GoogleCloudRetailV2alphaImportCompletionDataRequest"
+                      },
+                      "response": {
+                        "$ref": "GoogleLongrunningOperation"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
+                    }
+                  }
+                },
                 "operations": {
                   "methods": {
                     "get": {
@@ -469,6 +747,34 @@
                       "scopes": [
                         "https://www.googleapis.com/auth/cloud-platform"
                       ]
+                    },
+                    "search": {
+                      "description": "Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                      "flatPath": "v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search",
+                      "httpMethod": "POST",
+                      "id": "retail.projects.locations.catalogs.placements.search",
+                      "parameterOrder": [
+                        "placement"
+                      ],
+                      "parameters": {
+                        "placement": {
+                          "description": "Required. The resource name of the search engine placement, such as `projects/*/locations/global/catalogs/default_catalog/placements/default_search`. This field is used to identify the set of models that will be used to make the search. We currently support one placement with the following ID: * `default_search`.",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/placements/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v2alpha/{+placement}:search",
+                      "request": {
+                        "$ref": "GoogleCloudRetailV2alphaSearchRequest"
+                      },
+                      "response": {
+                        "$ref": "GoogleCloudRetailV2alphaSearchResponse"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
                     }
                   }
                 },
@@ -706,7 +1012,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210723",
   "rootUrl": "https://retail.googleapis.com/",
   "schemas": {
     "GoogleApiHttpBody": {
@@ -859,6 +1165,32 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2AddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2AddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2AddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2AddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2ImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2ImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2ImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2ImportErrorsConfig",
@@ -884,6 +1216,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -973,6 +1313,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2RemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2RemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2RemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2RemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2SetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2SetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2UserEventImportSummary": {
       "description": "A summary of import result. The UserEventImportSummary summarizes the import status for user events.",
       "id": "GoogleCloudRetailV2UserEventImportSummary",
@@ -990,12 +1354,72 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaAddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaAddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaAddFulfillmentPlacesRequest": {
+      "description": "Request message for AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaAddFulfillmentPlacesRequest",
+      "properties": {
+        "addTime": {
+          "description": "The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "allowMissing": {
+          "description": "If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "placeIds": {
+          "description": "Required. The IDs for this type, such as the store IDs for \"pickup-in-store\" or the region IDs for \"same-day-delivery\" to be added for this type. Duplicate IDs will be automatically ignored. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned. If the total number of place IDs exceeds 2000 for this type after adding, then the update will be rejected.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "type": {
+          "description": "Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaAddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaAddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaAudience": {
+      "description": "An intended audience of the Product for whom it's sold.",
+      "id": "GoogleCloudRetailV2alphaAudience",
+      "properties": {
+        "ageGroups": {
+          "description": "The age groups of the audience. Strongly encouraged to use the standard values: \"newborn\" (up to 3 months old), \"infant\" (3\u201312 months old), \"toddler\" (1\u20135 years old), \"kids\" (5\u201313 years old), \"adult\" (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "genders": {
+          "description": "The genders of the audience. Strongly encouraged to use the standard values: \"male\", \"female\", \"unisex\". At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaBigQuerySource": {
       "description": "BigQuery source import data from.",
       "id": "GoogleCloudRetailV2alphaBigQuerySource",
       "properties": {
         "dataSchema": {
-          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.",
+          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.",
           "type": "string"
         },
         "datasetId": {
@@ -1006,6 +1430,10 @@
           "description": "Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.",
           "type": "string"
         },
+        "partitionDate": {
+          "$ref": "GoogleTypeDate",
+          "description": "BigQuery time partitioned table's _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`."
+        },
         "projectId": {
           "description": "The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.",
           "type": "string"
@@ -1025,6 +1453,10 @@
           "description": "Required. Immutable. The catalog display name. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
           "type": "string"
         },
+        "merchantCenterLinkingConfig": {
+          "$ref": "GoogleCloudRetailV2alphaMerchantCenterLinkingConfig",
+          "description": "The Merchant Center linking configuration. Once a link is added, the data stream from Merchant Center to Cloud Retail will be enabled automatically. The requester must have access to the merchant center account in order to make changes to this field."
+        },
         "name": {
           "description": "Required. Immutable. The fully qualified resource name of the catalog.",
           "type": "string"
@@ -1036,10 +1468,120 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaColorInfo": {
+      "description": "The color information of a Product.",
+      "id": "GoogleCloudRetailV2alphaColorInfo",
+      "properties": {
+        "colorFamilies": {
+          "description": "The standard color families. Strongly recommended to use the following standard color groups: \"Red\", \"Pink\", \"Orange\", \"Yellow\", \"Purple\", \"Green\", \"Cyan\", \"Blue\", \"Brown\", \"White\", \"Gray\", \"Black\" and \"Mixed\". Normally it is expected to have only 1 color family. May consider using single \"Mixed\" instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "colors": {
+          "description": "The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single \"Mixed\" instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaCompleteQueryResponse": {
+      "description": "Response of the auto-complete query.",
+      "id": "GoogleCloudRetailV2alphaCompleteQueryResponse",
+      "properties": {
+        "attributionToken": {
+          "description": "A unique complete token. This should be included in the SearchRequest resulting from this completion, which enables accurate attribution of complete model performance.",
+          "type": "string"
+        },
+        "completionResults": {
+          "description": "Results of the matching suggestions. The result list is ordered and the first result is top suggestion.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaCompleteQueryResponseCompletionResult"
+          },
+          "type": "array"
+        },
+        "recentSearchResults": {
+          "description": "Matched recent searches of this user. This field is a restricted feature. Contact Retail Support (retail-search-support@google.com) if you are interested in enabling it. This feature is only available when CompleteQueryRequest.visitor_id field is set and UserEvent is imported. The recent searches satisfy the follow rules: * They are ordered from latest to oldest. * They are matched with CompleteQueryRequest.query case insensitively. * They are transformed to lower cases. * They are UTF-8 safe. Recent searches are deduplicated. More recent searches will be reserved when duplication happens.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaCompleteQueryResponseRecentSearchResult"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaCompleteQueryResponseCompletionResult": {
+      "description": "Resource that represents completion results.",
+      "id": "GoogleCloudRetailV2alphaCompleteQueryResponseCompletionResult",
+      "properties": {
+        "attributes": {
+          "additionalProperties": {
+            "$ref": "GoogleCloudRetailV2alphaCustomAttribute"
+          },
+          "description": "Additional custom attributes ingested through BigQuery.",
+          "type": "object"
+        },
+        "suggestion": {
+          "description": "The suggestion for the query.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaCompleteQueryResponseRecentSearchResult": {
+      "description": "Recent search of this user.",
+      "id": "GoogleCloudRetailV2alphaCompleteQueryResponseRecentSearchResult",
+      "properties": {
+        "recentSearch": {
+          "description": "The recent search query.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaCompletionDataInputConfig": {
+      "description": "The input config source for completion data.",
+      "id": "GoogleCloudRetailV2alphaCompletionDataInputConfig",
+      "properties": {
+        "bigQuerySource": {
+          "$ref": "GoogleCloudRetailV2alphaBigQuerySource",
+          "description": "Required. BigQuery input source. Add the IAM permission \u201cBigQuery Data Viewer\u201d for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown."
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaCompletionDetail": {
+      "description": "Detailed completion information including completion attribution token and clicked completion info.",
+      "id": "GoogleCloudRetailV2alphaCompletionDetail",
+      "properties": {
+        "completionAttributionToken": {
+          "description": "Completion attribution token in CompleteQueryResponse.attribution_token.",
+          "type": "string"
+        },
+        "selectedPosition": {
+          "description": "End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "selectedSuggestion": {
+          "description": "End user selected CompleteQueryResponse.CompletionResult.suggestion.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaCustomAttribute": {
       "description": "A custom attribute that is not explicitly modeled in Product.",
       "id": "GoogleCloudRetailV2alphaCustomAttribute",
       "properties": {
+        "indexable": {
+          "description": "If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.",
+          "type": "boolean"
+        },
         "numbers": {
           "description": "The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is \"lengths_cm\". At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -1048,6 +1590,10 @@
           },
           "type": "array"
         },
+        "searchable": {
+          "description": "If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.",
+          "type": "boolean"
+        },
         "text": {
           "description": "The textual values of this custom attribute. For example, `[\"yellow\", \"green\"]` when the key is \"color\". At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -1122,12 +1668,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaFulfillmentInfo": {
+      "description": "Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.",
+      "id": "GoogleCloudRetailV2alphaFulfillmentInfo",
+      "properties": {
+        "placeIds": {
+          "description": "The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "type": {
+          "description": "The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaGcsSource": {
       "description": "Google Cloud Storage location for input content. format.",
       "id": "GoogleCloudRetailV2alphaGcsSource",
       "properties": {
         "dataSchema": {
-          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.",
+          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.",
           "type": "string"
         },
         "inputUris": {
@@ -1140,6 +1704,26 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaGetDefaultBranchResponse": {
+      "description": "Response message of CatalogService.GetDefaultBranch.",
+      "id": "GoogleCloudRetailV2alphaGetDefaultBranchResponse",
+      "properties": {
+        "branch": {
+          "description": "Full resource name of the branch id currently set as default branch.",
+          "type": "string"
+        },
+        "note": {
+          "description": "This corresponds to SetDefaultBranchRequest.note field, when this branch was set as default.",
+          "type": "string"
+        },
+        "setTime": {
+          "description": "The time when this branch is set to default.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaImage": {
       "description": "Product thumbnail/detail image.",
       "id": "GoogleCloudRetailV2alphaImage",
@@ -1161,6 +1745,35 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaImportCompletionDataRequest": {
+      "description": "Request message for ImportCompletionData methods.",
+      "id": "GoogleCloudRetailV2alphaImportCompletionDataRequest",
+      "properties": {
+        "inputConfig": {
+          "$ref": "GoogleCloudRetailV2alphaCompletionDataInputConfig",
+          "description": "Required. The desired input location of the data."
+        },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2alphaImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2alphaImportErrorsConfig",
@@ -1186,6 +1799,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -1211,6 +1832,28 @@
           "$ref": "GoogleCloudRetailV2alphaProductInputConfig",
           "description": "Required. The desired input location of the data."
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.",
+          "type": "string"
+        },
+        "reconciliationMode": {
+          "description": "The mode of reconciliation between existing products and the products to be imported. Defaults to ReconciliationMode.INCREMENTAL.",
+          "enum": [
+            "RECONCILIATION_MODE_UNSPECIFIED",
+            "INCREMENTAL",
+            "FULL"
+          ],
+          "enumDescriptions": [
+            "Defaults to INCREMENTAL.",
+            "Inserts new products or updates existing products.",
+            "Calculates diff and replaces the entire product dataset. Existing products may be deleted if they are not present in the source location. Can only be while using BigQuerySource. Add the IAM permission \u201cBigQuery Data Viewer\u201d for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search."
+          ],
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Unique identifier provided by client, within the ancestor dataset scope. Ensures idempotency and used for request deduplication. Server-generated if unspecified. Up to 128 characters long and must match the pattern: \"[a-zA-Z0-9_]+\". This is returned as Operation.name in ImportMetadata. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.",
+          "type": "string"
+        },
         "updateMask": {
           "description": "Indicates which fields in the provided imported 'products' to update. If not set, will by default update all fields.",
           "format": "google-fieldmask",
@@ -1274,6 +1917,33 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaInterval": {
+      "description": "A floating point interval.",
+      "id": "GoogleCloudRetailV2alphaInterval",
+      "properties": {
+        "exclusiveMaximum": {
+          "description": "Exclusive upper bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "exclusiveMinimum": {
+          "description": "Exclusive lower bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "maximum": {
+          "description": "Inclusive upper bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "minimum": {
+          "description": "Inclusive lower bound.",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaListCatalogsResponse": {
       "description": "Response for CatalogService.ListCatalogs method.",
       "id": "GoogleCloudRetailV2alphaListCatalogsResponse",
@@ -1292,6 +1962,66 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaListProductsResponse": {
+      "description": "Response message for ProductService.ListProducts method.",
+      "id": "GoogleCloudRetailV2alphaListProductsResponse",
+      "properties": {
+        "nextPageToken": {
+          "description": "A token that can be sent as ListProductsRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.",
+          "type": "string"
+        },
+        "products": {
+          "description": "The Products.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaProduct"
+          },
+          "type": "array"
+        },
+        "totalSize": {
+          "description": "The total count of matched Products irrespective of pagination. The total number of Products returned by pagination may be less than the total_size that matches. This field is ignored if ListProductsRequest.require_total_size is not set or ListProductsRequest.page_token is not empty.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaMerchantCenterLink": {
+      "description": "Represents a link between a Merchant Center account and a branch. Once a link is established, products from the linked merchant center account will be streamed to the linked branch.",
+      "id": "GoogleCloudRetailV2alphaMerchantCenterLink",
+      "properties": {
+        "branchId": {
+          "description": "The branch id (e.g. 0/1/2) within this catalog that products from merchant_center_account_id are streamed to. When updating this field, an empty value will use the currently configured default branch. However, changing the default branch later on won't change the linked branch here. A single branch id can only have one linked merchant center account id.",
+          "type": "string"
+        },
+        "destinations": {
+          "description": "String representing the destination to import for, all if left empty. List of possible values can be found here. [https://support.google.com/merchants/answer/7501026?hl=en] List of allowed string values: \"shopping-ads\", \"buy-on-google-listings\", \"display-ads\", \"local-inventory -ads\", \"free-listings\", \"free-local-listings\" NOTE: The string values are case sensitive.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "merchantCenterAccountId": {
+          "description": "Required. The linked [Merchant center account id](https://developers.google.com/shopping-content/guides/accountstatuses). The account must be a standalone account or a sub-account of a MCA.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaMerchantCenterLinkingConfig": {
+      "description": "Configures Merchant Center linking. Links contained in the config will be used to sync data from a Merchant Center account to a Cloud Retail branch.",
+      "id": "GoogleCloudRetailV2alphaMerchantCenterLinkingConfig",
+      "properties": {
+        "links": {
+          "description": "Links between Merchant Center accounts and branches.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaMerchantCenterLink"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaPredictRequest": {
       "description": "Request message for Predict method.",
       "id": "GoogleCloudRetailV2alphaPredictRequest",
@@ -1391,7 +2121,7 @@
           "type": "number"
         },
         "currencyCode": {
-          "description": "The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.",
+          "description": "The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.",
           "type": "string"
         },
         "originalPrice": {
@@ -1403,6 +2133,36 @@
           "description": "Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).",
           "format": "float",
           "type": "number"
+        },
+        "priceEffectiveTime": {
+          "description": "The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "priceExpireTime": {
+          "description": "The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "priceRange": {
+          "$ref": "GoogleCloudRetailV2alphaPriceInfoPriceRange",
+          "description": "Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.",
+          "readOnly": true
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaPriceInfoPriceRange": {
+      "description": "The price range of all variant Product having the same Product.primary_product_id.",
+      "id": "GoogleCloudRetailV2alphaPriceInfoPriceRange",
+      "properties": {
+        "originalPrice": {
+          "$ref": "GoogleCloudRetailV2alphaInterval",
+          "description": "The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id."
+        },
+        "price": {
+          "$ref": "GoogleCloudRetailV2alphaInterval",
+          "description": "The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id."
         }
       },
       "type": "object"
@@ -1415,9 +2175,13 @@
           "additionalProperties": {
             "$ref": "GoogleCloudRetailV2alphaCustomAttribute"
           },
-          "description": "Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ \"vendor\": {\"text\": [\"vendor123\", \"vendor456\"]}, \"lengths_cm\": {\"numbers\":[2.3, 15.4]}, \"heights_cm\": {\"numbers\":[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.",
+          "description": "Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ \"vendor\": {\"text\": [\"vendor123\", \"vendor456\"]}, \"lengths_cm\": {\"numbers\":[2.3, 15.4]}, \"heights_cm\": {\"numbers\":[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.",
           "type": "object"
         },
+        "audience": {
+          "$ref": "GoogleCloudRetailV2alphaAudience",
+          "description": "The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product."
+        },
         "availability": {
           "description": "The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).",
           "enum": [
@@ -1442,10 +2206,17 @@
           "type": "integer"
         },
         "availableTime": {
-          "description": "The timestamp when this Product becomes available for recommendation.",
+          "description": "The timestamp when this Product becomes available for SearchService.Search.",
           "format": "google-datetime",
           "type": "string"
         },
+        "brands": {
+          "description": "The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "categories": {
           "description": "Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [\"Shoes & Accessories\" -> \"Shoes\"] and [\"Sports & Fitness\" -> \"Athletic Clothing\" -> \"Shoes\"], it could be represented as: \"categories\": [ \"Shoes & Accessories > Shoes\", \"Sports & Fitness > Athletic Clothing > Shoes\" ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436",
           "items": {
@@ -1453,10 +2224,44 @@
           },
           "type": "array"
         },
+        "collectionMemberIds": {
+          "description": "The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "colorInfo": {
+          "$ref": "GoogleCloudRetailV2alphaColorInfo",
+          "description": "The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color)."
+        },
+        "conditions": {
+          "description": "The condition of the product. Strongly encouraged to use the standard values: \"new\", \"refurbished\", \"used\". A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "description": {
           "description": "Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).",
           "type": "string"
         },
+        "expireTime": {
+          "description": "The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "fulfillmentInfo": {
+          "description": "Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaFulfillmentInfo"
+          },
+          "type": "array"
+        },
+        "gtin": {
+          "description": "The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
         "id": {
           "description": "Immutable. Product identifier, which is the final component of name. For example, this field is \"id_1\", if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).",
           "type": "string"
@@ -1468,10 +2273,28 @@
           },
           "type": "array"
         },
+        "languageCode": {
+          "description": "Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to \"en-US\" if unset.",
+          "type": "string"
+        },
+        "materials": {
+          "description": "The material of the product. For example, \"leather\", \"wooden\". A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "name": {
           "description": "Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be \"default_branch\".",
           "type": "string"
         },
+        "patterns": {
+          "description": "The pattern or graphic print of the product. For example, \"striped\", \"polka dot\", \"paisley\". A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "priceInfo": {
           "$ref": "GoogleCloudRetailV2alphaPriceInfo",
           "description": "Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371)."
@@ -1480,6 +2303,34 @@
           "description": "Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).",
           "type": "string"
         },
+        "promotions": {
+          "description": "The promotions applied to the product. A maximum of 10 values are allowed per Product.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaPromotion"
+          },
+          "type": "array"
+        },
+        "publishTime": {
+          "description": "The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "rating": {
+          "$ref": "GoogleCloudRetailV2alphaRating",
+          "description": "The rating of this product."
+        },
+        "retrievableFields": {
+          "description": "Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form \"attributes.key\" where \"key\" is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "google-fieldmask",
+          "type": "string"
+        },
+        "sizes": {
+          "description": "The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in \"US:MENS:M\", \"US\" represents size system; \"MENS\" represents size type; \"M\" represents size value. In \"GIRLS:27\", size system is empty; \"GIRLS\" represents size type; \"27\" represents size value. In \"32 inches\", both size system and size type are empty, while size value is \"32 inches\". A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "tags": {
           "description": "Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0\u20134](https://support.google.com/merchants/answer/6324473).",
           "items": {
@@ -1491,6 +2342,11 @@
           "description": "Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).",
           "type": "string"
         },
+        "ttl": {
+          "description": "Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.",
+          "format": "google-duration",
+          "type": "string"
+        },
         "type": {
           "description": "Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.",
           "enum": [
@@ -1510,6 +2366,14 @@
         "uri": {
           "description": "Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).",
           "type": "string"
+        },
+        "variants": {
+          "description": "Output only. Product variants grouped together on primary product which share similar product attributes. It's automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaProduct"
+          },
+          "readOnly": true,
+          "type": "array"
         }
       },
       "type": "object"
@@ -1578,6 +2442,17 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaPromotion": {
+      "description": "Promotion information.",
+      "id": "GoogleCloudRetailV2alphaPromotion",
+      "properties": {
+        "promotionId": {
+          "description": "ID of the promotion. For example, \"free gift\". The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaPurchaseTransaction": {
       "description": "A transaction represents the entire purchase transaction.",
       "id": "GoogleCloudRetailV2alphaPurchaseTransaction",
@@ -1641,6 +2516,31 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaRating": {
+      "description": "The rating of a Product.",
+      "id": "GoogleCloudRetailV2alphaRating",
+      "properties": {
+        "averageRating": {
+          "description": "The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "float",
+          "type": "number"
+        },
+        "ratingCount": {
+          "description": "The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "ratingHistogram": {
+          "description": "List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.",
+          "items": {
+            "format": "int32",
+            "type": "integer"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaRejoinUserEventsMetadata": {
       "description": "Metadata for RejoinUserEvents method.",
       "id": "GoogleCloudRetailV2alphaRejoinUserEventsMetadata",
@@ -1680,6 +2580,477 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesRequest": {
+      "description": "Request message for RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesRequest",
+      "properties": {
+        "allowMissing": {
+          "description": "If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "placeIds": {
+          "description": "Required. The IDs for this type, such as the store IDs for \"pickup-in-store\" or the region IDs for \"same-day-delivery\", to be removed for this type. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "removeTime": {
+          "description": "The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "type": {
+          "description": "Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchRequest": {
+      "description": "Request message for SearchService.Search method.",
+      "id": "GoogleCloudRetailV2alphaSearchRequest",
+      "properties": {
+        "boostSpec": {
+          "$ref": "GoogleCloudRetailV2alphaSearchRequestBoostSpec",
+          "description": "Boost specification to boost certain products. See more details at this [user guide](/retail/private/docs/boosting)."
+        },
+        "branch": {
+          "description": "The branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use \"default_branch\" as the branch ID or leave this field empty, to search products under the default branch.",
+          "type": "string"
+        },
+        "canonicalFilter": {
+          "description": "The filter applied to every search request when quality improvement such as query expansion is needed. For example, if a query does not have enough results, an expanded query with SearchRequest.canonical_filter will be returned as a supplement of the original query. This field is strongly recommended to achieve high search quality. See SearchRequest.filter for more details about filter syntax.",
+          "type": "string"
+        },
+        "dynamicFacetSpec": {
+          "$ref": "GoogleCloudRetailV2alphaSearchRequestDynamicFacetSpec",
+          "description": "The specification for dynamically generated facets. Notice that only textual facets can be dynamically generated. This feature requires additional allowlisting. Contact Retail Support (retail-search-support@google.com) if you are interested in using dynamic facet feature."
+        },
+        "facetSpecs": {
+          "description": "Facet specifications for faceted search. If empty, no facets are returned. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaSearchRequestFacetSpec"
+          },
+          "type": "array"
+        },
+        "filter": {
+          "description": "The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. Filter expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#filter). If this field is unrecognizable, an INVALID_ARGUMENT is returned.",
+          "type": "string"
+        },
+        "offset": {
+          "description": "A 0-indexed integer that specifies the current offset (that is, starting result location, amongst the Products deemed by the API as relevant) in search results. This field is only considered if page_token is unset. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "orderBy": {
+          "description": "The order in which products are returned. Products can be ordered by a field in an Product object. Leave it unset if ordered by relevance. OrderBy expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#order). If this field is unrecognizable, an INVALID_ARGUMENT is returned.",
+          "type": "string"
+        },
+        "pageCategories": {
+          "description": "The categories associated with a category page. Required for category navigation queries to achieve good search quality. The format should be the same as UserEvent.page_categories; To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: \"pageCategories\" : [\"Sales > 2017 Black Friday Deals\"].",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "pageSize": {
+          "description": "Maximum number of Products to return. If unspecified, defaults to a reasonable value. The maximum allowed value is 120. Values above 120 will be coerced to 120. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "pageToken": {
+          "description": "A page token SearchResponse.next_page_token, received from a previous SearchService.Search call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to SearchService.Search must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "query": {
+          "description": "Raw search query.",
+          "type": "string"
+        },
+        "queryExpansionSpec": {
+          "$ref": "GoogleCloudRetailV2alphaSearchRequestQueryExpansionSpec",
+          "description": "The query expansion specification that specifies the conditions under which query expansion will occur. See more details at this [user guide](/retail/private/docs/result-size#query_expansion)."
+        },
+        "relevanceThreshold": {
+          "description": "The relevance threshold of the search results. Defaults to RelevanceThreshold.HIGH, which means only the most relevant results are shown, and the least number of results are returned. See more details at this [user guide](/retail/private/docs/result-size#relevance_thresholding).",
+          "enum": [
+            "RELEVANCE_THRESHOLD_UNSPECIFIED",
+            "HIGH",
+            "MEDIUM",
+            "LOW",
+            "LOWEST"
+          ],
+          "enumDescriptions": [
+            "Default value. Defaults to RelevanceThreshold.HIGH.",
+            "High relevance threshold.",
+            "Medium relevance threshold.",
+            "Low relevance threshold.",
+            "Lowest relevance threshold."
+          ],
+          "type": "string"
+        },
+        "userInfo": {
+          "$ref": "GoogleCloudRetailV2alphaUserInfo",
+          "description": "User information."
+        },
+        "variantRollupKeys": {
+          "description": "The keys to fetch and rollup the matching variant Products attributes. The attributes from all the matching variant Products are merged and de-duplicated. Notice that rollup variant Products attributes will lead to extra query latency. Maximum number of keys is 10. For Product.fulfillment_info, a fulfillment type and a fulfillment ID must be provided in the format of \"fulfillmentType.filfillmentId\". E.g., in \"pickupInStore.store123\", \"pickupInStore\" is fulfillment type and \"store123\" is the store ID. Supported keys are: * colorFamilies * price * originalPrice * discount * attributes.key, where key is any key in the Product.attributes map. * pickupInStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.PICKUP_IN_STORE. * shipToStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SHIP_TO_STORE. * sameDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SAME_DAY_DELIVERY. * nextDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * customFulfillment1.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_1. * customFulfillment2.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_2. * customFulfillment3.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_3. * customFulfillment4.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_4. * customFulfillment5.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_5. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "visitorId": {
+          "description": "Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchRequestBoostSpec": {
+      "description": "Boost specification to boost certain items.",
+      "id": "GoogleCloudRetailV2alphaSearchRequestBoostSpec",
+      "properties": {
+        "conditionBoostSpecs": {
+          "description": "Condition boost specifications. If a product matches multiple conditions in the specifictions, boost scores from these specifications are all applied and combined in a non-linear way. Maximum number of specifications is 10.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaSearchRequestBoostSpecConditionBoostSpec"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchRequestBoostSpecConditionBoostSpec": {
+      "description": "Boost applies to products which match a condition.",
+      "id": "GoogleCloudRetailV2alphaSearchRequestBoostSpecConditionBoostSpec",
+      "properties": {
+        "boost": {
+          "description": "Strength of the condition boost, which should be in [-1, 1]. Negative boost means demotion. Default is 0.0. Setting to 1.0 gives the item a big promotion. However, it does not necessarily mean that the boosted item will be the top result at all times, nor that other items will be excluded. Results could still be shown even when none of them matches the condition. And results that are significantly more relevant to the search query can still trump your heavily favored but irrelevant items. Setting to -1.0 gives the item a big demotion. However, results that are deeply relevant might still be shown. The item will have an upstream battle to get a fairly high ranking, but it is not blocked out completely. Setting to 0.0 means no boost applied. The boosting condition is ignored.",
+          "format": "float",
+          "type": "number"
+        },
+        "condition": {
+          "description": "An expression which specifies a boost condition. The syntax and supported fields are the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Examples: * To boost products with product ID \"product_1\" or \"product_2\", and color \"Red\" or \"Blue\": *(id: ANY(\"product_1\", \"product_2\")) * *AND * *(colorFamilies: ANY(\"Red\", \"Blue\")) *",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchRequestDynamicFacetSpec": {
+      "description": "The specifications of dynamically generated facets.",
+      "id": "GoogleCloudRetailV2alphaSearchRequestDynamicFacetSpec",
+      "properties": {
+        "mode": {
+          "description": "Mode of the DynamicFacet feature. Defaults to Mode.DISABLED if it's unset.",
+          "enum": [
+            "MODE_UNSPECIFIED",
+            "DISABLED",
+            "ENABLED"
+          ],
+          "enumDescriptions": [
+            "Default value.",
+            "Disable Dynamic Facet.",
+            "Automatic mode built by Google Retail Search."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchRequestFacetSpec": {
+      "description": "A facet specification to perform faceted search.",
+      "id": "GoogleCloudRetailV2alphaSearchRequestFacetSpec",
+      "properties": {
+        "enableDynamicPosition": {
+          "description": "Enables dynamic position for this facet. If set to true, the position of this facet among all facets in the response is determined by Google Retail Search. It will be ordered together with dynamic facets if dynamic facets is enabled. If set to false, the position of this facet in the response will be the same as in the request, and it will be ranked before the facets with dynamic position enable and all dynamic facets. For example, you may always want to have rating facet returned in the response, but it's not necessarily to always display the rating facet at the top. In that case, you can set enable_dynamic_position to true so that the position of rating facet in response will be determined by Google Retail Search. Another example, assuming you have the following facets in the request: * \"rating\", enable_dynamic_position = true * \"price\", enable_dynamic_position = false * \"brands\", enable_dynamic_position = false And also you have a dynamic facets enable, which will generate a facet 'gender'. Then the final order of the facets in the response can be (\"price\", \"brands\", \"rating\", \"gender\") or (\"price\", \"brands\", \"gender\", \"rating\") depends on how Google Retail Search orders \"gender\" and \"rating\" facets. However, notice that \"price\" and \"brands\" will always be ranked at 1st and 2nd position since their enable_dynamic_position are false.",
+          "type": "boolean"
+        },
+        "excludedFilterKeys": {
+          "description": "List of keys to exclude when faceting. By default, FacetKey.key is not excluded from the filter unless it is listed in this field. For example, suppose there are 100 products with color facet \"Red\" and 200 products with color facet \"Blue\". A query containing the filter \"colorFamilies:ANY(\"Red\")\" and have \"colorFamilies\" as FacetKey.key will by default return the \"Red\" with count 100. If this field contains \"colorFamilies\", then the query returns both the \"Red\" with count 100 and \"Blue\" with count 200, because the \"colorFamilies\" key is now excluded from the filter. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "facetKey": {
+          "$ref": "GoogleCloudRetailV2alphaSearchRequestFacetSpecFacetKey",
+          "description": "Required. The facet key specification."
+        },
+        "limit": {
+          "description": "Maximum of facet values that should be returned for this facet. If unspecified, defaults to 20. The maximum allowed value is 300. Values above 300 will be coerced to 300. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchRequestFacetSpecFacetKey": {
+      "description": "Specifies how a facet is computed.",
+      "id": "GoogleCloudRetailV2alphaSearchRequestFacetSpecFacetKey",
+      "properties": {
+        "contains": {
+          "description": "Only get facet values that contains the given strings. For example, suppose \"categories\" has three values \"Women > Shoe\", \"Women > Dress\" and \"Men > Shoe\". If set \"contains\" to \"Shoe\", the \"categories\" facet will give only \"Women > Shoe\" and \"Men > Shoe\". Only supported on textual fields. Maximum is 10.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "intervals": {
+          "description": "Set only if values should be bucketized into intervals. Must be set for facets with numerical values. Must not be set for facet with text values. Maximum number of intervals is 30.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaInterval"
+          },
+          "type": "array"
+        },
+        "key": {
+          "description": "Required. Supported textual and numerical facet keys in Product object, over which the facet values are computed. Facet key is case-sensitive. Allowed facet keys when FacetKey.query is not specified: * textual_field = *# The Product.brands. * \"brands\"; *# The Product.categories. * \"categories\"; *# The Audience.genders. * | \"genders\"; *# The Audience.age_groups. * | \"ageGroups\"; *# The Product.availability. Value is one of * *# \"IN_STOCK\", \"OUT_OF_STOCK\", PREORDER\", \"BACKORDER\". * | \"availability\"; *# The ColorInfo.color_families. * | \"colorFamilies\"; *# The ColorInfo.colors. * | \"colors\"; *# The Product.sizes. * | \"sizes\"; *# The Product.materials. * | \"materials\"; *# The Product.patterns. * | \"patterns\"; *# The Product.conditions. * | \"conditions\"; *# The textual custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are textual. * *# map. * | \"attributes.key\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.PICKUP_IN_STORE. * | \"pickupInStore\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SHIP_TO_STORE. * | \"shipToStore\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SAME_DAY_DELIVERY. * | \"sameDayDelivery\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * | \"nextDayDelivery\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_1. * | \"customFulfillment1\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_2. * | \"customFulfillment2\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_3. * | \"customFulfillment3\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_4. * | \"customFulfillment4\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_5. * | \"customFulfillment5\"; * numerical_field = *# The PriceInfo.price. * \"price\"; *# The discount. Computed by (original_price-price)/price * \"discount\"; *# The Rating.average_rating. * \"rating\"; *# The Rating.rating_count. * \"ratingCount\"; *# The numerical custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are numerical. * | \"attributes.key\";",
+          "type": "string"
+        },
+        "orderBy": {
+          "description": "The order in which Facet.values are returned. Allowed values are: * \"count desc\", which means order by Facet.FacetValue.count descending. * \"value desc\", which means order by Facet.FacetValue.value descending. Only applies to textual facets. If not set, textual values are sorted in [natural order](https://en.wikipedia.org/wiki/Natural_sort_order); numerical intervals are sorted in the order given by FacetSpec.FacetKey.intervals; FulfillmentInfo.ids are sorted in the order given by FacetSpec.FacetKey.restricted_values.",
+          "type": "string"
+        },
+        "prefixes": {
+          "description": "Only get facet values that start with the given string prefix. For example, suppose \"categories\" has three values \"Women > Shoe\", \"Women > Dress\" and \"Men > Shoe\". If set \"prefixes\" to \"Women\", the \"categories\" facet will give only \"Women > Shoe\" and \"Women > Dress\". Only supported on textual fields. Maximum is 10.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "query": {
+          "description": "The query that is used to compute facet for the given facet key. When provided, it will override the default behavior of facet computation. The query syntax is the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Notice that there is no limitation on FacetKey.key when query is specified. In the response, FacetValue.value will be always \"1\" and FacetValue.count will be the number of results that matches the query. For example, you can set a customized facet for \"shipToStore\", where FacetKey.key is \"customizedShipToStore\", and FacetKey.query is \"availability: ANY(\\\"IN_STOCK\\\") AND shipToStore: ANY(\\\"123\\\")\". Then the facet will count the products that are both in stock and ship to store \"123\".",
+          "type": "string"
+        },
+        "restrictedValues": {
+          "description": "Only get facet for the given restricted values. For example, when using \"pickupInStore\" as key and set restricted values to [\"store123\", \"store456\"], only facets for \"store123\" and \"store456\" are returned. Only supported on textual fields and fulfillments. Maximum is 20. Must be set for the fulfillment facet keys: * pickupInStore * shipToStore * sameDayDelivery * nextDayDelivery * customFulfillment1 * customFulfillment2 * customFulfillment3 * customFulfillment4 * customFulfillment5",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchRequestQueryExpansionSpec": {
+      "description": "Specification to determine under which conditions query expansion should occur.",
+      "id": "GoogleCloudRetailV2alphaSearchRequestQueryExpansionSpec",
+      "properties": {
+        "condition": {
+          "description": "The condition under which query expansion should occur. Default to Condition.DISABLED.",
+          "enum": [
+            "CONDITION_UNSPECIFIED",
+            "DISABLED",
+            "AUTO"
+          ],
+          "enumDescriptions": [
+            "Unspecified query expansion condition. This defaults to Condition.DISABLED.",
+            "Disabled query expansion. Only the exact search query is used, even if SearchResponse.total_size is zero.",
+            "Automatic query expansion built by Google Retail Search."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchResponse": {
+      "description": "Response message for SearchService.Search method.",
+      "id": "GoogleCloudRetailV2alphaSearchResponse",
+      "properties": {
+        "attributionToken": {
+          "description": "A unique search token. This should be included in the UserEvent logs resulting from this search, which enables accurate attribution of search model performance.",
+          "type": "string"
+        },
+        "correctedQuery": {
+          "description": "If spell correction applies, the corrected query. Otherwise, empty.",
+          "type": "string"
+        },
+        "facets": {
+          "description": "Results of facets requested by user.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaSearchResponseFacet"
+          },
+          "type": "array"
+        },
+        "nextPageToken": {
+          "description": "A token that can be sent as SearchRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.",
+          "type": "string"
+        },
+        "queryExpansionInfo": {
+          "$ref": "GoogleCloudRetailV2alphaSearchResponseQueryExpansionInfo",
+          "description": "Query expansion information for the returned results."
+        },
+        "redirectUri": {
+          "description": "The URI of a customer-defined redirect page. If redirect action is triggered, no search will be performed, and only redirect_uri and attribution_token will be set in the response.",
+          "type": "string"
+        },
+        "results": {
+          "description": "A list of matched items. The order represents the ranking.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaSearchResponseSearchResult"
+          },
+          "type": "array"
+        },
+        "totalSize": {
+          "description": "The estimated total count of matched items irrespective of pagination. The count of results returned by pagination may be less than the total_size that matches.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchResponseFacet": {
+      "description": "A facet result.",
+      "id": "GoogleCloudRetailV2alphaSearchResponseFacet",
+      "properties": {
+        "dynamicFacet": {
+          "description": "Whether the facet is dynamically generated.",
+          "type": "boolean"
+        },
+        "key": {
+          "description": "The key for this facet. E.g., \"colorFamilies\" or \"price\" or \"attributes.attr1\".",
+          "type": "string"
+        },
+        "values": {
+          "description": "The facet values for this field.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2alphaSearchResponseFacetFacetValue"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchResponseFacetFacetValue": {
+      "description": "A facet value which contains value names and their count.",
+      "id": "GoogleCloudRetailV2alphaSearchResponseFacetFacetValue",
+      "properties": {
+        "count": {
+          "description": "Number of items that have this facet value.",
+          "format": "int64",
+          "type": "string"
+        },
+        "interval": {
+          "$ref": "GoogleCloudRetailV2alphaInterval",
+          "description": "Interval value for a facet, such as [10, 20) for facet \"price\"."
+        },
+        "value": {
+          "description": "Text value of a facet, such as \"Black\" for facet \"colorFamilies\".",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchResponseQueryExpansionInfo": {
+      "description": "Information describing query expansion including whether expansion has occurred.",
+      "id": "GoogleCloudRetailV2alphaSearchResponseQueryExpansionInfo",
+      "properties": {
+        "expandedQuery": {
+          "description": "Bool describing whether query expansion has occurred.",
+          "type": "boolean"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSearchResponseSearchResult": {
+      "description": "Represents the search results.",
+      "id": "GoogleCloudRetailV2alphaSearchResponseSearchResult",
+      "properties": {
+        "id": {
+          "description": "Product.id of the searched Product.",
+          "type": "string"
+        },
+        "matchingVariantCount": {
+          "description": "The count of matched variant Products.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "matchingVariantFields": {
+          "additionalProperties": {
+            "format": "google-fieldmask",
+            "type": "string"
+          },
+          "description": "If a variant Product matches the search query, this map indicates which Product fields are matched. The key is the Product.name, the value is a field mask of the matched Product fields. If matched attributes cannot be determined, this map will be empty. For example, a key \"sku1\" with field mask \"products.color_info\" indicates there is a match between \"sku1\" ColorInfo and the query.",
+          "type": "object"
+        },
+        "product": {
+          "$ref": "GoogleCloudRetailV2alphaProduct",
+          "description": "The product data snippet in the search response. Only Product.name is guaranteed to be populated. Product.variants contains the product variants that match the search query. If there are multiple product variants matching the query, top 5 most relevant product variants are returned and ordered by relevancy. If relevancy can be deternmined, use matching_variant_fields to look up matched product variants fields. If relevancy cannot be determined, e.g. when searching \"shoe\" all products in a shoe product can be a match, 5 product variants are returned but order is meaningless."
+        },
+        "variantRollupValues": {
+          "additionalProperties": {
+            "type": "any"
+          },
+          "description": "The rollup matching variant Product attributes. The key is one of the SearchRequest.variant_rollup_keys. The values are the merged and de-duplicated Product attributes. Notice that the rollup values are respect filter. For example, when filtering by \"colorFamilies:ANY(\\\"red\\\")\" and rollup \"colorFamilies\", only \"red\" is returned. For textual and numerical attributes, the rollup values is a list of string or double values with type google.protobuf.ListValue. For example, if there are two variants with colors \"red\" and \"blue\", the rollup values are { key: \"colorFamilies\" value { list_value { values { string_value: \"red\" } values { string_value: \"blue\" } } } } For Product.fulfillment_info, the rollup values is a double value with type google.protobuf.Value. For example, {key: \"pickupInStore.store1\" value { number_value: 10 }} means a there are 10 variants in this product are available in the store \"store1\".",
+          "type": "object"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSetDefaultBranchRequest": {
+      "description": "Request message to set a specified branch as new default_branch.",
+      "id": "GoogleCloudRetailV2alphaSetDefaultBranchRequest",
+      "properties": {
+        "branchId": {
+          "description": "The final component of the resource name of a branch. This field must be one of \"0\", \"1\" or \"2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "note": {
+          "description": "Some note on this request, this can be retrieved by CatalogService.GetDefaultBranch before next valid default branch set occurs. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2alphaSetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSetInventoryRequest": {
+      "description": "Request message for SetInventory method.",
+      "id": "GoogleCloudRetailV2alphaSetInventoryRequest",
+      "properties": {
+        "allowMissing": {
+          "description": "If set to true, and the Product with name Product.name is not found, the inventory update will still be processed and retained for at most 1 day until the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "inventory": {
+          "$ref": "GoogleCloudRetailV2alphaProduct",
+          "description": "Required. The inventory information to update. The allowable fields to update are: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info The updated inventory fields must be specified in SetInventoryRequest.set_mask. If SetInventoryRequest.inventory.name is empty or invalid, an INVALID_ARGUMENT error is returned. If the caller does not have permission to update the Product named in Product.name, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. If the Product to update does not have existing inventory information, the provided inventory information will be inserted. If the Product to update has existing inventory information, the provided inventory information will be merged while respecting the last update time for each inventory field, using the provided or default value for SetInventoryRequest.set_time. The last update time is recorded for the following inventory fields: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info If a full overwrite of inventory information while ignoring timestamps is needed, UpdateProduct should be invoked instead."
+        },
+        "setMask": {
+          "description": "Indicates which inventory fields in the provided Product to update. If not set or set with empty paths, all inventory fields will be updated. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned and the entire update will be ignored.",
+          "format": "google-fieldmask",
+          "type": "string"
+        },
+        "setTime": {
+          "description": "The time when the request is issued, used to prevent out-of-order updates on inventory fields with the last update time recorded. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2alphaSetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaUserEvent": {
       "description": "UserEvent captures all metadata information Retail API needs to know about how end users interact with customers' website.",
       "id": "GoogleCloudRetailV2alphaUserEvent",
@@ -1692,13 +3063,17 @@
           "type": "object"
         },
         "attributionToken": {
-          "description": "Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K's page. When recording events on product K's page, log the PredictResponse.attribution_token to this field.",
+          "description": "Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K's page. When recording events on product K's page, log the PredictResponse.attribution_token to this field.",
           "type": "string"
         },
         "cartId": {
           "description": "The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.",
           "type": "string"
         },
+        "completionDetail": {
+          "$ref": "GoogleCloudRetailV2alphaCompletionDetail",
+          "description": "The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion."
+        },
         "eventTime": {
           "description": "Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.",
           "format": "google-datetime",
@@ -1715,6 +3090,19 @@
           },
           "type": "array"
         },
+        "filter": {
+          "description": "The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "offset": {
+          "description": "An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "orderBy": {
+          "description": "The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
         "pageCategories": {
           "description": "The categories associated with a category page. To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: \"pageCategories\" : [\"Sales > 2017 Black Friday Deals\"]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -1742,7 +3130,11 @@
           "type": "string"
         },
         "searchQuery": {
-          "description": "The user's search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "description": "The user's search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "sessionId": {
+          "description": "A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.",
           "type": "string"
         },
         "uri": {
@@ -1819,11 +3211,11 @@
           "type": "boolean"
         },
         "ipAddress": {
-          "description": "The end user's IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. \"104.133.9.80\") or an IPv6 address (e.g. \"2001:0db8:85a3:0000:0000:8a2e:0370:7334\"). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
+          "description": "The end user's IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. \"104.133.9.80\") or an IPv6 address (e.g. \"2001:0db8:85a3:0000:0000:8a2e:0370:7334\"). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
           "type": "string"
         },
         "userAgent": {
-          "description": "User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
+          "description": "User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
           "type": "string"
         },
         "userId": {
@@ -1833,6 +3225,18 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaAddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaAddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaAddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaAddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaExportErrorsConfig": {
       "description": "Configuration of destination for Export related errors.",
       "id": "GoogleCloudRetailV2betaExportErrorsConfig",
@@ -1897,6 +3301,20 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2betaImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2betaImportErrorsConfig",
@@ -1922,6 +3340,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -2011,6 +3437,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaRemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaRemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaRemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaRemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2betaSetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2betaSetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaUserEventImportSummary": {
       "description": "A summary of import result. The UserEventImportSummary summarizes the import status for user events.",
       "id": "GoogleCloudRetailV2betaUserEventImportSummary",
@@ -2113,6 +3563,28 @@
         }
       },
       "type": "object"
+    },
+    "GoogleTypeDate": {
+      "description": "Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.",
+      "id": "GoogleTypeDate",
+      "properties": {
+        "day": {
+          "description": "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "month": {
+          "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "year": {
+          "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
     }
   },
   "servicePath": "",
diff --git a/googleapiclient/discovery_cache/documents/retail.v2beta.json b/googleapiclient/discovery_cache/documents/retail.v2beta.json
index 1328a74..c42b4e4 100644
--- a/googleapiclient/discovery_cache/documents/retail.v2beta.json
+++ b/googleapiclient/discovery_cache/documents/retail.v2beta.json
@@ -111,6 +111,88 @@
           "resources": {
             "catalogs": {
               "methods": {
+                "completeQuery": {
+                  "description": "Completes the specified prefix with keyword suggestions. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery",
+                  "httpMethod": "GET",
+                  "id": "retail.projects.locations.catalogs.completeQuery",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "Required. Catalog for which the completion is performed. Full resource name of catalog, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "dataset": {
+                      "description": "Determines which dataset to use for fetching completion. \"user-data\" will use the imported dataset through ImportCompletionData. \"cloud-retail\" will use the dataset generated by cloud retail based on user events. If leave empty, it will use the \"user-data\". Current supported values: * user-data * cloud-retail This option is not automatically enabled. Before using cloud-retail, contact retail-search-support@google.com first.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "deviceType": {
+                      "description": "The device type context for completion suggestions. It is useful to apply different suggestions on different device types, e.g. DESKTOP, MOBILE. If it is empty, the suggestions are across all device types. Supported formats: * UNKNOWN_DEVICE_TYPE * DESKTOP * MOBILE * A customized string starts with OTHER_, e.g. OTHER_IPHONE.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "languageCodes": {
+                      "description": "The list of languages of the query. This is the BCP-47 language code, such as \"en-US\" or \"sr-Latn\". For more information, see [Tags for Identifying Languages](https://tools.ietf.org/html/bcp47). The maximum number of allowed characters is 255. Only \"en-US\" is currently supported.",
+                      "location": "query",
+                      "repeated": true,
+                      "type": "string"
+                    },
+                    "maxSuggestions": {
+                      "description": "Completion max suggestions. The maximum allowed max suggestions is 20. The default value is 20.",
+                      "format": "int32",
+                      "location": "query",
+                      "type": "integer"
+                    },
+                    "query": {
+                      "description": "Required. The query used to generate suggestions. The maximum number of allowed characters is 255.",
+                      "location": "query",
+                      "type": "string"
+                    },
+                    "visitorId": {
+                      "description": "A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+                      "location": "query",
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2beta/{+catalog}:completeQuery",
+                  "response": {
+                    "$ref": "GoogleCloudRetailV2betaCompleteQueryResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
+                "getDefaultBranch": {
+                  "description": "Get which branch is currently default branch set by CatalogService.SetDefaultBranch method under a specified parent catalog. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch",
+                  "httpMethod": "GET",
+                  "id": "retail.projects.locations.catalogs.getDefaultBranch",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "The parent catalog resource name, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2beta/{+catalog}:getDefaultBranch",
+                  "response": {
+                    "$ref": "GoogleCloudRetailV2betaGetDefaultBranchResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
                 "list": {
                   "description": "Lists all the Catalogs associated with the project.",
                   "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs",
@@ -180,6 +262,34 @@
                   "scopes": [
                     "https://www.googleapis.com/auth/cloud-platform"
                   ]
+                },
+                "setDefaultBranch": {
+                  "description": "Set a specified branch id as default branch. API methods such as SearchService.Search, ProductService.GetProduct, ProductService.ListProducts will treat requests using \"default_branch\" to the actual branch id set as default. For example, if `projects/*/locations/*/catalogs/*/branches/1` is set as default, setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/default_branch` is equivalent to setting SearchRequest.branch to `projects/*/locations/*/catalogs/*/branches/1`. Using multiple branches can be useful when developers would like to have a staging branch to test and verify for future usage. When it becomes ready, developers switch on the staging branch using this API while keeping using `projects/*/locations/*/catalogs/*/branches/default_branch` as SearchRequest.branch to route the traffic to this staging branch. CAUTION: If you have live predict/search traffic, switching the default branch could potentially cause outages if the ID space of the new branch is very different from the old one. More specifically: * PredictionService will only return product IDs from branch {newBranch}. * SearchService will only return product IDs from branch {newBranch} (if branch is not explicitly set). * UserEventService will only join events with products from branch {newBranch}. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                  "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch",
+                  "httpMethod": "POST",
+                  "id": "retail.projects.locations.catalogs.setDefaultBranch",
+                  "parameterOrder": [
+                    "catalog"
+                  ],
+                  "parameters": {
+                    "catalog": {
+                      "description": "Full resource name of the catalog, such as `projects/*/locations/global/catalogs/default_catalog`.",
+                      "location": "path",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "path": "v2beta/{+catalog}:setDefaultBranch",
+                  "request": {
+                    "$ref": "GoogleCloudRetailV2betaSetDefaultBranchRequest"
+                  },
+                  "response": {
+                    "$ref": "GoogleProtobufEmpty"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
                 }
               },
               "resources": {
@@ -216,6 +326,34 @@
                     },
                     "products": {
                       "methods": {
+                        "addFulfillmentPlaces": {
+                          "description": "Incrementally adds place IDs to Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the added place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces",
+                          "parameterOrder": [
+                            "product"
+                          ],
+                          "parameters": {
+                            "product": {
+                              "description": "Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2beta/{+product}:addFulfillmentPlaces",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2betaAddFulfillmentPlacesRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
                         "create": {
                           "description": "Creates a Product.",
                           "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products",
@@ -327,6 +465,53 @@
                             "https://www.googleapis.com/auth/cloud-platform"
                           ]
                         },
+                        "list": {
+                          "description": "Gets a list of Products.",
+                          "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products",
+                          "httpMethod": "GET",
+                          "id": "retail.projects.locations.catalogs.branches.products.list",
+                          "parameterOrder": [
+                            "parent"
+                          ],
+                          "parameters": {
+                            "filter": {
+                              "description": "A filter to apply on the list results. Supported features: * List all the products under the parent branch if filter is unset. * List Product.Type.VARIANT Products sharing the same Product.Type.PRIMARY Product. For example: `primary_product_id = \"some_product_id\"` * List Products bundled in a Product.Type.COLLECTION Product. For example: `collection_product_id = \"some_product_id\"` * List Products with a partibular type. For example: `type = \"PRIMARY\"` `type = \"VARIANT\"` `type = \"COLLECTION\"` If the field is unrecognizable, an INVALID_ARGUMENT error is returned. If the specified Product.Type.PRIMARY Product or Product.Type.COLLECTION Product does not exist, a NOT_FOUND error is returned.",
+                              "location": "query",
+                              "type": "string"
+                            },
+                            "pageSize": {
+                              "description": "Maximum number of Products to return. If unspecified, defaults to 100. The maximum allowed value is 1000. Values above 1000 will be coerced to 1000. If this field is negative, an INVALID_ARGUMENT error is returned.",
+                              "format": "int32",
+                              "location": "query",
+                              "type": "integer"
+                            },
+                            "pageToken": {
+                              "description": "A page token ListProductsResponse.next_page_token, received from a previous ProductService.ListProducts call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to ProductService.ListProducts must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.",
+                              "location": "query",
+                              "type": "string"
+                            },
+                            "parent": {
+                              "description": "Required. The parent branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use `default_branch` as the branch ID, to list products under the default branch. If the caller does not have permission to list Products under this branch, regardless of whether or not this branch exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+$",
+                              "required": true,
+                              "type": "string"
+                            },
+                            "readMask": {
+                              "description": "The fields of Product to return in the responses. If not set or empty, the following fields are returned: * Product.name * Product.id * Product.title * Product.uri * Product.images * Product.price_info * Product.brands If \"*\" is provided, all fields are returned. Product.name is always returned no matter what mask is set. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned.",
+                              "format": "google-fieldmask",
+                              "location": "query",
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2beta/{+parent}/products",
+                          "response": {
+                            "$ref": "GoogleCloudRetailV2betaListProductsResponse"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
                         "patch": {
                           "description": "Updates a Product.",
                           "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}",
@@ -365,11 +550,99 @@
                           "scopes": [
                             "https://www.googleapis.com/auth/cloud-platform"
                           ]
+                        },
+                        "removeFulfillmentPlaces": {
+                          "description": "Incrementally removes place IDs from a Product.fulfillment_info.place_ids. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, the removed place IDs are not immediately manifested in the Product queried by GetProduct or ListProducts. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces",
+                          "parameterOrder": [
+                            "product"
+                          ],
+                          "parameters": {
+                            "product": {
+                              "description": "Required. Full resource name of Product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/some_product_id`. If the caller does not have permission to access the Product, regardless of whether or not it exists, a PERMISSION_DENIED error is returned.",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2beta/{+product}:removeFulfillmentPlaces",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2betaRemoveFulfillmentPlacesRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
+                        },
+                        "setInventory": {
+                          "description": "Updates inventory information for a Product while respecting the last update timestamps of each inventory field. This process is asynchronous and does not require the Product to exist before updating fulfillment information. If the request is valid, the update will be enqueued and processed downstream. As a consequence, when a response is returned, updates are not immediately manifested in the Product queried by GetProduct or ListProducts. When inventory is updated with CreateProduct and UpdateProduct, the specified inventory field value(s) will overwrite any existing value(s) while ignoring the last update time for this field. Furthermore, the last update time for the specified inventory fields will be overwritten to the time of the CreateProduct or UpdateProduct request. If no inventory fields are set in CreateProductRequest.product, then any pre-existing inventory information for this product will be used. If no inventory fields are set in UpdateProductRequest.set_mask, then any existing inventory information will be preserved. Pre-existing inventory information can only be updated with SetInventory, AddFulfillmentPlaces, and RemoveFulfillmentPlaces. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                          "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory",
+                          "httpMethod": "POST",
+                          "id": "retail.projects.locations.catalogs.branches.products.setInventory",
+                          "parameterOrder": [
+                            "name"
+                          ],
+                          "parameters": {
+                            "name": {
+                              "description": "Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be \"default_branch\".",
+                              "location": "path",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/branches/[^/]+/products/.*$",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "path": "v2beta/{+name}:setInventory",
+                          "request": {
+                            "$ref": "GoogleCloudRetailV2betaSetInventoryRequest"
+                          },
+                          "response": {
+                            "$ref": "GoogleLongrunningOperation"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ]
                         }
                       }
                     }
                   }
                 },
+                "completionData": {
+                  "methods": {
+                    "import": {
+                      "description": "Bulk import of processed completion dataset. Request processing may be synchronous. Partial updating is not supported. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                      "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import",
+                      "httpMethod": "POST",
+                      "id": "retail.projects.locations.catalogs.completionData.import",
+                      "parameterOrder": [
+                        "parent"
+                      ],
+                      "parameters": {
+                        "parent": {
+                          "description": "Required. The catalog which the suggestions dataset belongs to. Format: `projects/1234/locations/global/catalogs/default_catalog`.",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v2beta/{+parent}/completionData:import",
+                      "request": {
+                        "$ref": "GoogleCloudRetailV2betaImportCompletionDataRequest"
+                      },
+                      "response": {
+                        "$ref": "GoogleLongrunningOperation"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
+                    }
+                  }
+                },
                 "operations": {
                   "methods": {
                     "get": {
@@ -469,6 +742,34 @@
                       "scopes": [
                         "https://www.googleapis.com/auth/cloud-platform"
                       ]
+                    },
+                    "search": {
+                      "description": "Performs a search. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search.",
+                      "flatPath": "v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search",
+                      "httpMethod": "POST",
+                      "id": "retail.projects.locations.catalogs.placements.search",
+                      "parameterOrder": [
+                        "placement"
+                      ],
+                      "parameters": {
+                        "placement": {
+                          "description": "Required. The resource name of the search engine placement, such as `projects/*/locations/global/catalogs/default_catalog/placements/default_search`. This field is used to identify the set of models that will be used to make the search. We currently support one placement with the following ID: * `default_search`.",
+                          "location": "path",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/catalogs/[^/]+/placements/[^/]+$",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "path": "v2beta/{+placement}:search",
+                      "request": {
+                        "$ref": "GoogleCloudRetailV2betaSearchRequest"
+                      },
+                      "response": {
+                        "$ref": "GoogleCloudRetailV2betaSearchResponse"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ]
                     }
                   }
                 },
@@ -706,7 +1007,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210723",
   "rootUrl": "https://retail.googleapis.com/",
   "schemas": {
     "GoogleApiHttpBody": {
@@ -859,6 +1160,32 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2AddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2AddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2AddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2AddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2ImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2ImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2ImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2ImportErrorsConfig",
@@ -884,6 +1211,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -973,6 +1308,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2RemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2RemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2RemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2RemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2SetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2SetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2SetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2UserEventImportSummary": {
       "description": "A summary of import result. The UserEventImportSummary summarizes the import status for user events.",
       "id": "GoogleCloudRetailV2UserEventImportSummary",
@@ -990,6 +1349,18 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaAddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaAddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaAddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaAddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaExportErrorsConfig": {
       "description": "Configuration of destination for Export related errors.",
       "id": "GoogleCloudRetailV2alphaExportErrorsConfig",
@@ -1054,6 +1425,20 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2alphaImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2alphaImportErrorsConfig",
@@ -1079,6 +1464,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -1168,6 +1561,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2alphaRemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2alphaSetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2alphaSetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2alphaSetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2alphaUserEventImportSummary": {
       "description": "A summary of import result. The UserEventImportSummary summarizes the import status for user events.",
       "id": "GoogleCloudRetailV2alphaUserEventImportSummary",
@@ -1185,12 +1602,72 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaAddFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the AddFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaAddFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaAddFulfillmentPlacesRequest": {
+      "description": "Request message for AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaAddFulfillmentPlacesRequest",
+      "properties": {
+        "addTime": {
+          "description": "The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "allowMissing": {
+          "description": "If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "placeIds": {
+          "description": "Required. The IDs for this type, such as the store IDs for \"pickup-in-store\" or the region IDs for \"same-day-delivery\" to be added for this type. Duplicate IDs will be automatically ignored. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned. If the total number of place IDs exceeds 2000 for this type after adding, then the update will be rejected.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "type": {
+          "description": "Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaAddFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the AddFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaAddFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaAudience": {
+      "description": "An intended audience of the Product for whom it's sold.",
+      "id": "GoogleCloudRetailV2betaAudience",
+      "properties": {
+        "ageGroups": {
+          "description": "The age groups of the audience. Strongly encouraged to use the standard values: \"newborn\" (up to 3 months old), \"infant\" (3\u201312 months old), \"toddler\" (1\u20135 years old), \"kids\" (5\u201313 years old), \"adult\" (typically teens or older). At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [age_group](https://support.google.com/merchants/answer/6324463). Schema.org property [Product.audience.suggestedMinAge](https://schema.org/suggestedMinAge) and [Product.audience.suggestedMaxAge](https://schema.org/suggestedMaxAge).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "genders": {
+          "description": "The genders of the audience. Strongly encouraged to use the standard values: \"male\", \"female\", \"unisex\". At most 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gender](https://support.google.com/merchants/answer/6324479). Schema.org property [Product.audience.suggestedGender](https://schema.org/suggestedGender).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaBigQuerySource": {
       "description": "BigQuery source import data from.",
       "id": "GoogleCloudRetailV2betaBigQuerySource",
       "properties": {
         "dataSchema": {
-          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.",
+          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.",
           "type": "string"
         },
         "datasetId": {
@@ -1201,6 +1678,10 @@
           "description": "Intermediate Cloud Storage directory used for the import with a length limit of 2,000 characters. Can be specified if one wants to have the BigQuery export to a specific Cloud Storage directory.",
           "type": "string"
         },
+        "partitionDate": {
+          "$ref": "GoogleTypeDate",
+          "description": "BigQuery time partitioned table's _PARTITIONDATE in YYYY-MM-DD format. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`."
+        },
         "projectId": {
           "description": "The project ID (can be project # or ID) that the BigQuery source is in with a length limit of 128 characters. If not specified, inherits the project ID from the parent request.",
           "type": "string"
@@ -1231,10 +1712,120 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaColorInfo": {
+      "description": "The color information of a Product.",
+      "id": "GoogleCloudRetailV2betaColorInfo",
+      "properties": {
+        "colorFamilies": {
+          "description": "The standard color families. Strongly recommended to use the following standard color groups: \"Red\", \"Pink\", \"Orange\", \"Yellow\", \"Purple\", \"Green\", \"Cyan\", \"Blue\", \"Brown\", \"White\", \"Gray\", \"Black\" and \"Mixed\". Normally it is expected to have only 1 color family. May consider using single \"Mixed\" instead of multiple values. A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "colors": {
+          "description": "The color display names, which may be different from standard color family names, such as the color aliases used in the website frontend. Normally it is expected to have only 1 color. May consider using single \"Mixed\" instead of multiple values. A maximum of 5 colors are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaCompleteQueryResponse": {
+      "description": "Response of the auto-complete query.",
+      "id": "GoogleCloudRetailV2betaCompleteQueryResponse",
+      "properties": {
+        "attributionToken": {
+          "description": "A unique complete token. This should be included in the SearchRequest resulting from this completion, which enables accurate attribution of complete model performance.",
+          "type": "string"
+        },
+        "completionResults": {
+          "description": "Results of the matching suggestions. The result list is ordered and the first result is top suggestion.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaCompleteQueryResponseCompletionResult"
+          },
+          "type": "array"
+        },
+        "recentSearchResults": {
+          "description": "Matched recent searches of this user. This field is a restricted feature. Contact Retail Support (retail-search-support@google.com) if you are interested in enabling it. This feature is only available when CompleteQueryRequest.visitor_id field is set and UserEvent is imported. The recent searches satisfy the follow rules: * They are ordered from latest to oldest. * They are matched with CompleteQueryRequest.query case insensitively. * They are transformed to lower cases. * They are UTF-8 safe. Recent searches are deduplicated. More recent searches will be reserved when duplication happens.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaCompleteQueryResponseRecentSearchResult"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaCompleteQueryResponseCompletionResult": {
+      "description": "Resource that represents completion results.",
+      "id": "GoogleCloudRetailV2betaCompleteQueryResponseCompletionResult",
+      "properties": {
+        "attributes": {
+          "additionalProperties": {
+            "$ref": "GoogleCloudRetailV2betaCustomAttribute"
+          },
+          "description": "Additional custom attributes ingested through BigQuery.",
+          "type": "object"
+        },
+        "suggestion": {
+          "description": "The suggestion for the query.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaCompleteQueryResponseRecentSearchResult": {
+      "description": "Recent search of this user.",
+      "id": "GoogleCloudRetailV2betaCompleteQueryResponseRecentSearchResult",
+      "properties": {
+        "recentSearch": {
+          "description": "The recent search query.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaCompletionDataInputConfig": {
+      "description": "The input config source for completion data.",
+      "id": "GoogleCloudRetailV2betaCompletionDataInputConfig",
+      "properties": {
+        "bigQuerySource": {
+          "$ref": "GoogleCloudRetailV2betaBigQuerySource",
+          "description": "Required. BigQuery input source. Add the IAM permission \u201cBigQuery Data Viewer\u201d for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown."
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaCompletionDetail": {
+      "description": "Detailed completion information including completion attribution token and clicked completion info.",
+      "id": "GoogleCloudRetailV2betaCompletionDetail",
+      "properties": {
+        "completionAttributionToken": {
+          "description": "Completion attribution token in CompleteQueryResponse.attribution_token.",
+          "type": "string"
+        },
+        "selectedPosition": {
+          "description": "End user selected CompleteQueryResponse.CompletionResult.suggestion position, starting from 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "selectedSuggestion": {
+          "description": "End user selected CompleteQueryResponse.CompletionResult.suggestion.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaCustomAttribute": {
       "description": "A custom attribute that is not explicitly modeled in Product.",
       "id": "GoogleCloudRetailV2betaCustomAttribute",
       "properties": {
+        "indexable": {
+          "description": "If true, custom attribute values are indexed, so that it can be filtered, faceted or boosted in SearchService.Search. This field is ignored in a UserEvent. See SearchRequest.filter, SearchRequest.facet_specs and SearchRequest.boost_spec for more details.",
+          "type": "boolean"
+        },
         "numbers": {
           "description": "The numerical values of this custom attribute. For example, `[2.3, 15.4]` when the key is \"lengths_cm\". At most 400 values are allowed.Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -1243,6 +1834,10 @@
           },
           "type": "array"
         },
+        "searchable": {
+          "description": "If true, custom attribute values are searchable by text queries in SearchService.Search. This field is ignored in a UserEvent. Only set if type text is set. Otherwise, a INVALID_ARGUMENT error is returned.",
+          "type": "boolean"
+        },
         "text": {
           "description": "The textual values of this custom attribute. For example, `[\"yellow\", \"green\"]` when the key is \"color\". At most 400 values are allowed. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 256 characters. Otherwise, an INVALID_ARGUMENT error is returned. Exactly one of text or numbers should be set. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -1317,12 +1912,30 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaFulfillmentInfo": {
+      "description": "Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods.",
+      "id": "GoogleCloudRetailV2betaFulfillmentInfo",
+      "properties": {
+        "placeIds": {
+          "description": "The IDs for this type, such as the store IDs for FulfillmentInfo.type.pickup-in-store or the region IDs for FulfillmentInfo.type.same-day-delivery. A maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "type": {
+          "description": "The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Customers have to map custom types to their display names before rendering UI. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaGcsSource": {
       "description": "Google Cloud Storage location for input content. format.",
       "id": "GoogleCloudRetailV2betaGcsSource",
       "properties": {
         "dataSchema": {
-          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719?hl=en.",
+          "description": "The schema to use when parsing the data from the source. Supported values for product imports: * `product` (default): One JSON Product per line. Each product must have a valid Product.id. * `product_merchant_center`: See [Importing catalog data from Merchant Center](https://cloud.google.com/retail/recommendations-ai/docs/upload-catalog#mc). Supported values for user events imports: * `user_event` (default): One JSON UserEvent per line. * `user_event_ga360`: Using https://support.google.com/analytics/answer/3437719.",
           "type": "string"
         },
         "inputUris": {
@@ -1335,6 +1948,26 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaGetDefaultBranchResponse": {
+      "description": "Response message of CatalogService.GetDefaultBranch.",
+      "id": "GoogleCloudRetailV2betaGetDefaultBranchResponse",
+      "properties": {
+        "branch": {
+          "description": "Full resource name of the branch id currently set as default branch.",
+          "type": "string"
+        },
+        "note": {
+          "description": "This corresponds to SetDefaultBranchRequest.note field, when this branch was set as default.",
+          "type": "string"
+        },
+        "setTime": {
+          "description": "The time when this branch is set to default.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaImage": {
       "description": "Product thumbnail/detail image.",
       "id": "GoogleCloudRetailV2betaImage",
@@ -1356,6 +1989,35 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaImportCompletionDataRequest": {
+      "description": "Request message for ImportCompletionData methods.",
+      "id": "GoogleCloudRetailV2betaImportCompletionDataRequest",
+      "properties": {
+        "inputConfig": {
+          "$ref": "GoogleCloudRetailV2betaCompletionDataInputConfig",
+          "description": "Required. The desired input location of the data."
+        },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaImportCompletionDataResponse": {
+      "description": "Response of the ImportCompletionDataRequest. If the long running operation is done, this message is returned by the google.longrunning.Operations.response field if the operation is successful.",
+      "id": "GoogleCloudRetailV2betaImportCompletionDataResponse",
+      "properties": {
+        "errorSamples": {
+          "description": "A sample of errors encountered while processing the request.",
+          "items": {
+            "$ref": "GoogleRpcStatus"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaImportErrorsConfig": {
       "description": "Configuration of destination for Import related errors.",
       "id": "GoogleCloudRetailV2betaImportErrorsConfig",
@@ -1381,6 +2043,14 @@
           "format": "int64",
           "type": "string"
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`.",
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Id of the request / operation. This is parroting back the requestId that was passed in the request.",
+          "type": "string"
+        },
         "successCount": {
           "description": "Count of entries that were processed successfully.",
           "format": "int64",
@@ -1406,6 +2076,28 @@
           "$ref": "GoogleCloudRetailV2betaProductInputConfig",
           "description": "Required. The desired input location of the data."
         },
+        "notificationPubsubTopic": {
+          "description": "Pub/Sub topic for receiving notification. If this field is set, when the import is finished, a notification will be sent to specified Pub/Sub topic. The message data will be JSON string of a Operation. Format of the Pub/Sub topic is `projects/{project}/topics/{topic}`. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.",
+          "type": "string"
+        },
+        "reconciliationMode": {
+          "description": "The mode of reconciliation between existing products and the products to be imported. Defaults to ReconciliationMode.INCREMENTAL.",
+          "enum": [
+            "RECONCILIATION_MODE_UNSPECIFIED",
+            "INCREMENTAL",
+            "FULL"
+          ],
+          "enumDescriptions": [
+            "Defaults to INCREMENTAL.",
+            "Inserts new products or updates existing products.",
+            "Calculates diff and replaces the entire product dataset. Existing products may be deleted if they are not present in the source location. Can only be while using BigQuerySource. Add the IAM permission \u201cBigQuery Data Viewer\u201d for cloud-retail-customer-data-access@system.gserviceaccount.com before using this feature otherwise an error is thrown. This feature is only available for users who have Retail Search enabled. Contact Retail Support (retail-search-support@google.com) if you are interested in using Retail Search."
+          ],
+          "type": "string"
+        },
+        "requestId": {
+          "description": "Unique identifier provided by client, within the ancestor dataset scope. Ensures idempotency and used for request deduplication. Server-generated if unspecified. Up to 128 characters long and must match the pattern: \"[a-zA-Z0-9_]+\". This is returned as Operation.name in ImportMetadata. Only supported when ImportProductsRequest.reconciliation_mode is set to `FULL`.",
+          "type": "string"
+        },
         "updateMask": {
           "description": "Indicates which fields in the provided imported 'products' to update. If not set, will by default update all fields.",
           "format": "google-fieldmask",
@@ -1469,6 +2161,33 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaInterval": {
+      "description": "A floating point interval.",
+      "id": "GoogleCloudRetailV2betaInterval",
+      "properties": {
+        "exclusiveMaximum": {
+          "description": "Exclusive upper bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "exclusiveMinimum": {
+          "description": "Exclusive lower bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "maximum": {
+          "description": "Inclusive upper bound.",
+          "format": "double",
+          "type": "number"
+        },
+        "minimum": {
+          "description": "Inclusive lower bound.",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaListCatalogsResponse": {
       "description": "Response for CatalogService.ListCatalogs method.",
       "id": "GoogleCloudRetailV2betaListCatalogsResponse",
@@ -1487,6 +2206,24 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaListProductsResponse": {
+      "description": "Response message for ProductService.ListProducts method.",
+      "id": "GoogleCloudRetailV2betaListProductsResponse",
+      "properties": {
+        "nextPageToken": {
+          "description": "A token that can be sent as ListProductsRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.",
+          "type": "string"
+        },
+        "products": {
+          "description": "The Products.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaProduct"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaPredictRequest": {
       "description": "Request message for Predict method.",
       "id": "GoogleCloudRetailV2betaPredictRequest",
@@ -1586,7 +2323,7 @@
           "type": "number"
         },
         "currencyCode": {
-          "description": "The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned.",
+          "description": "The 3-letter currency code defined in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html). If this field is an unrecognizable currency code, an INVALID_ARGUMENT error is returned. The Product.Type.VARIANT Products with the same Product.primary_product_id must share the same currency_code. Otherwise, a FAILED_PRECONDITION error is returned.",
           "type": "string"
         },
         "originalPrice": {
@@ -1598,6 +2335,36 @@
           "description": "Price of the product. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371). Schema.org property [Offer.priceSpecification](https://schema.org/priceSpecification).",
           "format": "float",
           "type": "number"
+        },
+        "priceEffectiveTime": {
+          "description": "The timestamp when the price starts to be effective. This can be set as a future timestamp, and the price is only used for search after price_effective_time. If so, the original_price must be set and original_price is used before price_effective_time. Do not set if price is always effective because it will cause additional latency during search.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "priceExpireTime": {
+          "description": "The timestamp when the price stops to be effective. The price is used for search before price_expire_time. If this field is set, the original_price must be set and original_price is used after price_expire_time. Do not set if price is always effective because it will cause additional latency during search.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "priceRange": {
+          "$ref": "GoogleCloudRetailV2betaPriceInfoPriceRange",
+          "description": "Output only. The price range of all the child Product.Type.VARIANT Products grouped together on the Product.Type.PRIMARY Product. Only populated for Product.Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.",
+          "readOnly": true
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaPriceInfoPriceRange": {
+      "description": "The price range of all variant Product having the same Product.primary_product_id.",
+      "id": "GoogleCloudRetailV2betaPriceInfoPriceRange",
+      "properties": {
+        "originalPrice": {
+          "$ref": "GoogleCloudRetailV2betaInterval",
+          "description": "The inclusive Product.pricing_info.original_price internal of all variant Product having the same Product.primary_product_id."
+        },
+        "price": {
+          "$ref": "GoogleCloudRetailV2betaInterval",
+          "description": "The inclusive Product.pricing_info.price interval of all variant Product having the same Product.primary_product_id."
         }
       },
       "type": "object"
@@ -1610,9 +2377,13 @@
           "additionalProperties": {
             "$ref": "GoogleCloudRetailV2betaCustomAttribute"
           },
-          "description": "Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ \"vendor\": {\"text\": [\"vendor123\", \"vendor456\"]}, \"lengths_cm\": {\"numbers\":[2.3, 15.4]}, \"heights_cm\": {\"numbers\":[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters.",
+          "description": "Highly encouraged. Extra product attributes to be included. For example, for products, this could include the store name, vendor, style, color, etc. These are very strong signals for recommendation model, thus we highly recommend providing the attributes here. Features that can take on one of a limited number of possible values. Two types of features can be set are: Textual features. some examples would be the brand/maker of a product, or country of a customer. Numerical features. Some examples would be the height/weight of a product, or age of a customer. For example: `{ \"vendor\": {\"text\": [\"vendor123\", \"vendor456\"]}, \"lengths_cm\": {\"numbers\":[2.3, 15.4]}, \"heights_cm\": {\"numbers\":[8.1, 6.4]} }`. This field needs to pass all below criteria, otherwise an INVALID_ARGUMENT error is returned: * Max entries count: 200 by default; 100 for Type.VARIANT. * The key must be a UTF-8 encoded string with a length limit of 128 characters. * Max indexable entries count: 200 by default; 40 for Type.VARIANT. * Max searchable entries count: 30. * For indexable attribute, the key must match the pattern: a-zA-Z0-9*. For example, key0LikeThis or KEY_1_LIKE_THIS.",
           "type": "object"
         },
+        "audience": {
+          "$ref": "GoogleCloudRetailV2betaAudience",
+          "description": "The target group associated with a given audience (e.g. male, veterans, car owners, musicians, etc.) of the product."
+        },
         "availability": {
           "description": "The online availability of the Product. Default to Availability.IN_STOCK. Google Merchant Center Property [availability](https://support.google.com/merchants/answer/6324448). Schema.org Property [Offer.availability](https://schema.org/availability).",
           "enum": [
@@ -1637,10 +2408,17 @@
           "type": "integer"
         },
         "availableTime": {
-          "description": "The timestamp when this Product becomes available for recommendation.",
+          "description": "The timestamp when this Product becomes available for SearchService.Search.",
           "format": "google-datetime",
           "type": "string"
         },
+        "brands": {
+          "description": "The brands of the product. A maximum of 30 brands are allowed. Each brand must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [brand](https://support.google.com/merchants/answer/6324351). Schema.org property [Product.brand](https://schema.org/brand).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "categories": {
           "description": "Product categories. This field is repeated for supporting one product belonging to several parallel categories. Strongly recommended using the full path for better search / recommendation quality. To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). For example, if a shoes product belongs to both [\"Shoes & Accessories\" -> \"Shoes\"] and [\"Sports & Fitness\" -> \"Athletic Clothing\" -> \"Shoes\"], it could be represented as: \"categories\": [ \"Shoes & Accessories > Shoes\", \"Sports & Fitness > Athletic Clothing > Shoes\" ] Must be set for Type.PRIMARY Product otherwise an INVALID_ARGUMENT error is returned. At most 250 values are allowed per Product. Empty values are not allowed. Each value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property google_product_category. Schema.org property [Product.category] (https://schema.org/category). [mc_google_product_category]: https://support.google.com/merchants/answer/6324436",
           "items": {
@@ -1648,10 +2426,44 @@
           },
           "type": "array"
         },
+        "collectionMemberIds": {
+          "description": "The id of the collection members when type is Type.COLLECTION. Should not set it for other types. A maximum of 1000 values are allowed. Otherwise, an INVALID_ARGUMENT error is return.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "colorInfo": {
+          "$ref": "GoogleCloudRetailV2betaColorInfo",
+          "description": "The color of the product. Google Merchant Center property [color](https://support.google.com/merchants/answer/6324487). Schema.org property [Product.color](https://schema.org/color)."
+        },
+        "conditions": {
+          "description": "The condition of the product. Strongly encouraged to use the standard values: \"new\", \"refurbished\", \"used\". A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [condition](https://support.google.com/merchants/answer/6324469). Schema.org property [Offer.itemCondition](https://schema.org/itemCondition).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "description": {
           "description": "Product description. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [description](https://support.google.com/merchants/answer/6324468). schema.org property [Product.description](https://schema.org/description).",
           "type": "string"
         },
+        "expireTime": {
+          "description": "The timestamp when this product becomes unavailable for SearchService.Search. If it is set, the Product is not available for SearchService.Search after expire_time. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts. Google Merchant Center property [expiration_date](https://support.google.com/merchants/answer/6324499).",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "fulfillmentInfo": {
+          "description": "Fulfillment information, such as the store IDs for in-store pickup or region IDs for different shipping methods. All the elements must have distinct FulfillmentInfo.type. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaFulfillmentInfo"
+          },
+          "type": "array"
+        },
+        "gtin": {
+          "description": "The Global Trade Item Number (GTIN) of the product. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [gtin](https://support.google.com/merchants/answer/6324461). Schema.org property [Product.isbn](https://schema.org/isbn) or [Product.gtin8](https://schema.org/gtin8) or [Product.gtin12](https://schema.org/gtin12) or [Product.gtin13](https://schema.org/gtin13) or [Product.gtin14](https://schema.org/gtin14). If the value is not a valid GTIN, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
         "id": {
           "description": "Immutable. Product identifier, which is the final component of name. For example, this field is \"id_1\", if name is `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/id_1`. This field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [id](https://support.google.com/merchants/answer/6324405). Schema.org Property [Product.sku](https://schema.org/sku).",
           "type": "string"
@@ -1663,10 +2475,28 @@
           },
           "type": "array"
         },
+        "languageCode": {
+          "description": "Language of the title/description and other string attributes. Use language tags defined by BCP 47. For product prediction, this field is ignored and the model automatically detects the text language. The Product can include text in different languages, but duplicating Products to provide text in multiple languages can result in degraded model performance. For product search this field is in use. It defaults to \"en-US\" if unset.",
+          "type": "string"
+        },
+        "materials": {
+          "description": "The material of the product. For example, \"leather\", \"wooden\". A maximum of 5 values are allowed. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [material](https://support.google.com/merchants/answer/6324410). Schema.org property [Product.material](https://schema.org/material).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "name": {
           "description": "Immutable. Full resource name of the product, such as `projects/*/locations/global/catalogs/default_catalog/branches/default_branch/products/product_id`. The branch ID must be \"default_branch\".",
           "type": "string"
         },
+        "patterns": {
+          "description": "The pattern or graphic print of the product. For example, \"striped\", \"polka dot\", \"paisley\". A maximum of 5 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [pattern](https://support.google.com/merchants/answer/6324483). Schema.org property [Product.pattern](https://schema.org/pattern).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "priceInfo": {
           "$ref": "GoogleCloudRetailV2betaPriceInfo",
           "description": "Product price and cost information. Google Merchant Center property [price](https://support.google.com/merchants/answer/6324371)."
@@ -1675,6 +2505,34 @@
           "description": "Variant group identifier. Must be an id, with the same parent branch with this product. Otherwise, an error is thrown. For Type.PRIMARY Products, this field can only be empty or set to the same value as id. For VARIANT Products, this field cannot be empty. A maximum of 2,000 products are allowed to share the same Type.PRIMARY Product. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center Property [item_group_id](https://support.google.com/merchants/answer/6324507). Schema.org Property [Product.inProductGroupWithID](https://schema.org/inProductGroupWithID). This field must be enabled before it can be used. [Learn more](/recommendations-ai/docs/catalog#item-group-id).",
           "type": "string"
         },
+        "promotions": {
+          "description": "The promotions applied to the product. A maximum of 10 values are allowed per Product.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaPromotion"
+          },
+          "type": "array"
+        },
+        "publishTime": {
+          "description": "The timestamp when the product is published by the retailer for the first time, which indicates the freshness of the products. Note that this field is different from available_time, given it purely describes product freshness regardless of when it is available on search and recommendation.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "rating": {
+          "$ref": "GoogleCloudRetailV2betaRating",
+          "description": "The rating of this product."
+        },
+        "retrievableFields": {
+          "description": "Indicates which fields in the Products are returned in SearchResponse. Supported fields for all types: * audience * availability * brands * color_info * conditions * gtin * materials * name * patterns * price_info * rating * sizes * title * uri Supported fields only for Type.PRIMARY and Type.COLLECTION: * categories * description * images Supported fields only for Type.VARIANT: * Only the first image in images To mark attributes as retrievable, include paths of the form \"attributes.key\" where \"key\" is the key of a custom attribute, as specified in attributes. For Type.PRIMARY and Type.COLLECTION, the following fields are always returned in SearchResponse by default: * name For Type.VARIANT, the following fields are always returned in by default: * name * color_info Maximum number of paths is 20. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "google-fieldmask",
+          "type": "string"
+        },
+        "sizes": {
+          "description": "The size of the product. To represent different size systems or size types, consider using this format: [[[size_system:]size_type:]size_value]. For example, in \"US:MENS:M\", \"US\" represents size system; \"MENS\" represents size type; \"M\" represents size value. In \"GIRLS:27\", size system is empty; \"GIRLS\" represents size type; \"27\" represents size value. In \"32 inches\", both size system and size type are empty, while size value is \"32 inches\". A maximum of 20 values are allowed per Product. Each value must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [size](https://support.google.com/merchants/answer/6324492), [size_type](https://support.google.com/merchants/answer/6324497) and [size_system](https://support.google.com/merchants/answer/6324502). Schema.org property [Product.size](https://schema.org/size).",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "tags": {
           "description": "Custom tags associated with the product. At most 250 values are allowed per Product. This value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This tag can be used for filtering recommendation results by passing the tag as part of the PredictRequest.filter. Google Merchant Center property [custom_label_0\u20134](https://support.google.com/merchants/answer/6324473).",
           "items": {
@@ -1686,6 +2544,11 @@
           "description": "Required. Product title. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [title](https://support.google.com/merchants/answer/6324415). Schema.org property [Product.name](https://schema.org/name).",
           "type": "string"
         },
+        "ttl": {
+          "description": "Input only. The TTL (time to live) of the product. If it is set, expire_time is set as current timestamp plus ttl. The derived expire_time is returned in the output and ttl is left blank when retrieving the Product. If it is set, the product is not available for SearchService.Search after current timestamp plus ttl. However, the product can still be retrieved by ProductService.GetProduct and ProductService.ListProducts.",
+          "format": "google-duration",
+          "type": "string"
+        },
         "type": {
           "description": "Immutable. The type of the product. Default to Catalog.product_level_config.ingestion_product_type if unset.",
           "enum": [
@@ -1705,6 +2568,14 @@
         "uri": {
           "description": "Canonical URL directly linking to the product detail page. It is strongly recommended to provide a valid uri for the product, otherwise the service performance could be significantly degraded. This field must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [link](https://support.google.com/merchants/answer/6324416). Schema.org property [Offer.url](https://schema.org/url).",
           "type": "string"
+        },
+        "variants": {
+          "description": "Output only. Product variants grouped together on primary product which share similar product attributes. It's automatically grouped by primary_product_id for all the product variants. Only populated for Type.PRIMARY Products. Note: This field is OUTPUT_ONLY for ProductService.GetProduct. Do not set this field in API requests.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaProduct"
+          },
+          "readOnly": true,
+          "type": "array"
         }
       },
       "type": "object"
@@ -1773,6 +2644,17 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaPromotion": {
+      "description": "Promotion information.",
+      "id": "GoogleCloudRetailV2betaPromotion",
+      "properties": {
+        "promotionId": {
+          "description": "ID of the promotion. For example, \"free gift\". The value value must be a UTF-8 encoded string with a length limit of 128 characters, and match the pattern: a-zA-Z*. For example, id0LikeThis or ID_1_LIKE_THIS. Otherwise, an INVALID_ARGUMENT error is returned. Google Merchant Center property [promotion](https://support.google.com/merchants/answer/7050148).",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaPurchaseTransaction": {
       "description": "A transaction represents the entire purchase transaction.",
       "id": "GoogleCloudRetailV2betaPurchaseTransaction",
@@ -1836,6 +2718,31 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaRating": {
+      "description": "The rating of a Product.",
+      "id": "GoogleCloudRetailV2betaRating",
+      "properties": {
+        "averageRating": {
+          "description": "The average rating of the Product. The rating is scaled at 1-5. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "float",
+          "type": "number"
+        },
+        "ratingCount": {
+          "description": "The total number of ratings. This value is independent of the value of rating_histogram. This value must be nonnegative. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "ratingHistogram": {
+          "description": "List of rating counts per rating value (index = rating - 1). The list is empty if there is no rating. If the list is non-empty, its size is always 5. Otherwise, an INVALID_ARGUMENT error is returned. For example, [41, 14, 13, 47, 303]. It means that the Product got 41 ratings with 1 star, 14 ratings with 2 star, and so on.",
+          "items": {
+            "format": "int32",
+            "type": "integer"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaRejoinUserEventsMetadata": {
       "description": "Metadata for RejoinUserEvents method.",
       "id": "GoogleCloudRetailV2betaRejoinUserEventsMetadata",
@@ -1875,6 +2782,459 @@
       },
       "type": "object"
     },
+    "GoogleCloudRetailV2betaRemoveFulfillmentPlacesMetadata": {
+      "description": "Metadata related to the progress of the RemoveFulfillmentPlaces operation. Currently empty because there is no meaningful metadata populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaRemoveFulfillmentPlacesMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaRemoveFulfillmentPlacesRequest": {
+      "description": "Request message for RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaRemoveFulfillmentPlacesRequest",
+      "properties": {
+        "allowMissing": {
+          "description": "If set to true, and the Product is not found, the fulfillment information will still be processed and retained for at most 1 day and processed once the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "placeIds": {
+          "description": "Required. The IDs for this type, such as the store IDs for \"pickup-in-store\" or the region IDs for \"same-day-delivery\", to be removed for this type. At least 1 value is required, and a maximum of 2000 values are allowed. Each value must be a string with a length limit of 10 characters, matching the pattern [a-zA-Z0-9_-]+, such as \"store1\" or \"REGION-2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "removeTime": {
+          "description": "The time when the fulfillment updates are issued, used to prevent out-of-order updates on fulfillment information. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "type": {
+          "description": "Required. The fulfillment type, including commonly used types (such as pickup in store and same day delivery), and custom types. Supported values: * \"pickup-in-store\" * \"ship-to-store\" * \"same-day-delivery\" * \"next-day-delivery\" * \"custom-type-1\" * \"custom-type-2\" * \"custom-type-3\" * \"custom-type-4\" * \"custom-type-5\" If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned. This field directly corresponds to Product.fulfillment_info.type.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaRemoveFulfillmentPlacesResponse": {
+      "description": "Response of the RemoveFulfillmentPlacesRequest. Currently empty because there is no meaningful response populated from the RemoveFulfillmentPlaces method.",
+      "id": "GoogleCloudRetailV2betaRemoveFulfillmentPlacesResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchRequest": {
+      "description": "Request message for SearchService.Search method.",
+      "id": "GoogleCloudRetailV2betaSearchRequest",
+      "properties": {
+        "boostSpec": {
+          "$ref": "GoogleCloudRetailV2betaSearchRequestBoostSpec",
+          "description": "Boost specification to boost certain products. See more details at this [user guide](/retail/private/docs/boosting)."
+        },
+        "branch": {
+          "description": "The branch resource name, such as `projects/*/locations/global/catalogs/default_catalog/branches/0`. Use \"default_branch\" as the branch ID or leave this field empty, to search products under the default branch.",
+          "type": "string"
+        },
+        "canonicalFilter": {
+          "description": "The filter applied to every search request when quality improvement such as query expansion is needed. For example, if a query does not have enough results, an expanded query with SearchRequest.canonical_filter will be returned as a supplement of the original query. This field is strongly recommended to achieve high search quality. See SearchRequest.filter for more details about filter syntax.",
+          "type": "string"
+        },
+        "dynamicFacetSpec": {
+          "$ref": "GoogleCloudRetailV2betaSearchRequestDynamicFacetSpec",
+          "description": "The specification for dynamically generated facets. Notice that only textual facets can be dynamically generated. This feature requires additional allowlisting. Contact Retail Support (retail-search-support@google.com) if you are interested in using dynamic facet feature."
+        },
+        "facetSpecs": {
+          "description": "Facet specifications for faceted search. If empty, no facets are returned. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaSearchRequestFacetSpec"
+          },
+          "type": "array"
+        },
+        "filter": {
+          "description": "The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. Filter expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#filter). If this field is unrecognizable, an INVALID_ARGUMENT is returned.",
+          "type": "string"
+        },
+        "offset": {
+          "description": "A 0-indexed integer that specifies the current offset (that is, starting result location, amongst the Products deemed by the API as relevant) in search results. This field is only considered if page_token is unset. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "orderBy": {
+          "description": "The order in which products are returned. Products can be ordered by a field in an Product object. Leave it unset if ordered by relevance. OrderBy expression is case-sensitive. See more details at this [user guide](/retail/private/docs/filter-and-order#order). If this field is unrecognizable, an INVALID_ARGUMENT is returned.",
+          "type": "string"
+        },
+        "pageCategories": {
+          "description": "The categories associated with a category page. Required for category navigation queries to achieve good search quality. The format should be the same as UserEvent.page_categories; To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: \"pageCategories\" : [\"Sales > 2017 Black Friday Deals\"].",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "pageSize": {
+          "description": "Maximum number of Products to return. If unspecified, defaults to a reasonable value. The maximum allowed value is 120. Values above 120 will be coerced to 120. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "pageToken": {
+          "description": "A page token SearchResponse.next_page_token, received from a previous SearchService.Search call. Provide this to retrieve the subsequent page. When paginating, all other parameters provided to SearchService.Search must match the call that provided the page token. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "query": {
+          "description": "Raw search query.",
+          "type": "string"
+        },
+        "queryExpansionSpec": {
+          "$ref": "GoogleCloudRetailV2betaSearchRequestQueryExpansionSpec",
+          "description": "The query expansion specification that specifies the conditions under which query expansion will occur. See more details at this [user guide](/retail/private/docs/result-size#query_expansion)."
+        },
+        "userInfo": {
+          "$ref": "GoogleCloudRetailV2betaUserInfo",
+          "description": "User information."
+        },
+        "variantRollupKeys": {
+          "description": "The keys to fetch and rollup the matching variant Products attributes. The attributes from all the matching variant Products are merged and de-duplicated. Notice that rollup variant Products attributes will lead to extra query latency. Maximum number of keys is 10. For Product.fulfillment_info, a fulfillment type and a fulfillment ID must be provided in the format of \"fulfillmentType.filfillmentId\". E.g., in \"pickupInStore.store123\", \"pickupInStore\" is fulfillment type and \"store123\" is the store ID. Supported keys are: * colorFamilies * price * originalPrice * discount * attributes.key, where key is any key in the Product.attributes map. * pickupInStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.PICKUP_IN_STORE. * shipToStore.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SHIP_TO_STORE. * sameDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.SAME_DAY_DELIVERY. * nextDayDelivery.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * customFulfillment1.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_1. * customFulfillment2.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_2. * customFulfillment3.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_3. * customFulfillment4.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_4. * customFulfillment5.id, where id is any FulfillmentInfo.ids for type FulfillmentInfo.Type.CUSTOM_TYPE_5. If this field is set to an invalid value other than these, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "visitorId": {
+          "description": "Required. A unique identifier for tracking visitors. For example, this could be implemented with an HTTP cookie, which should be able to uniquely identify a visitor on a single device. This unique identifier should not change if the visitor logs in or out of the website. The field must be a UTF-8 encoded string with a length limit of 128 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchRequestBoostSpec": {
+      "description": "Boost specification to boost certain items.",
+      "id": "GoogleCloudRetailV2betaSearchRequestBoostSpec",
+      "properties": {
+        "conditionBoostSpecs": {
+          "description": "Condition boost specifications. If a product matches multiple conditions in the specifictions, boost scores from these specifications are all applied and combined in a non-linear way. Maximum number of specifications is 10.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaSearchRequestBoostSpecConditionBoostSpec"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchRequestBoostSpecConditionBoostSpec": {
+      "description": "Boost applies to products which match a condition.",
+      "id": "GoogleCloudRetailV2betaSearchRequestBoostSpecConditionBoostSpec",
+      "properties": {
+        "boost": {
+          "description": "Strength of the condition boost, which should be in [-1, 1]. Negative boost means demotion. Default is 0.0. Setting to 1.0 gives the item a big promotion. However, it does not necessarily mean that the boosted item will be the top result at all times, nor that other items will be excluded. Results could still be shown even when none of them matches the condition. And results that are significantly more relevant to the search query can still trump your heavily favored but irrelevant items. Setting to -1.0 gives the item a big demotion. However, results that are deeply relevant might still be shown. The item will have an upstream battle to get a fairly high ranking, but it is not blocked out completely. Setting to 0.0 means no boost applied. The boosting condition is ignored.",
+          "format": "float",
+          "type": "number"
+        },
+        "condition": {
+          "description": "An expression which specifies a boost condition. The syntax and supported fields are the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Examples: * To boost products with product ID \"product_1\" or \"product_2\", and color \"Red\" or \"Blue\": *(id: ANY(\"product_1\", \"product_2\")) * *AND * *(colorFamilies: ANY(\"Red\", \"Blue\")) *",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchRequestDynamicFacetSpec": {
+      "description": "The specifications of dynamically generated facets.",
+      "id": "GoogleCloudRetailV2betaSearchRequestDynamicFacetSpec",
+      "properties": {
+        "mode": {
+          "description": "Mode of the DynamicFacet feature. Defaults to Mode.DISABLED if it's unset.",
+          "enum": [
+            "MODE_UNSPECIFIED",
+            "DISABLED",
+            "ENABLED"
+          ],
+          "enumDescriptions": [
+            "Default value.",
+            "Disable Dynamic Facet.",
+            "Automatic mode built by Google Retail Search."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchRequestFacetSpec": {
+      "description": "A facet specification to perform faceted search.",
+      "id": "GoogleCloudRetailV2betaSearchRequestFacetSpec",
+      "properties": {
+        "enableDynamicPosition": {
+          "description": "Enables dynamic position for this facet. If set to true, the position of this facet among all facets in the response is determined by Google Retail Search. It will be ordered together with dynamic facets if dynamic facets is enabled. If set to false, the position of this facet in the response will be the same as in the request, and it will be ranked before the facets with dynamic position enable and all dynamic facets. For example, you may always want to have rating facet returned in the response, but it's not necessarily to always display the rating facet at the top. In that case, you can set enable_dynamic_position to true so that the position of rating facet in response will be determined by Google Retail Search. Another example, assuming you have the following facets in the request: * \"rating\", enable_dynamic_position = true * \"price\", enable_dynamic_position = false * \"brands\", enable_dynamic_position = false And also you have a dynamic facets enable, which will generate a facet 'gender'. Then the final order of the facets in the response can be (\"price\", \"brands\", \"rating\", \"gender\") or (\"price\", \"brands\", \"gender\", \"rating\") depends on how Google Retail Search orders \"gender\" and \"rating\" facets. However, notice that \"price\" and \"brands\" will always be ranked at 1st and 2nd position since their enable_dynamic_position are false.",
+          "type": "boolean"
+        },
+        "excludedFilterKeys": {
+          "description": "List of keys to exclude when faceting. By default, FacetKey.key is not excluded from the filter unless it is listed in this field. For example, suppose there are 100 products with color facet \"Red\" and 200 products with color facet \"Blue\". A query containing the filter \"colorFamilies:ANY(\"Red\")\" and have \"colorFamilies\" as FacetKey.key will by default return the \"Red\" with count 100. If this field contains \"colorFamilies\", then the query returns both the \"Red\" with count 100 and \"Blue\" with count 200, because the \"colorFamilies\" key is now excluded from the filter. A maximum of 100 values are allowed. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "facetKey": {
+          "$ref": "GoogleCloudRetailV2betaSearchRequestFacetSpecFacetKey",
+          "description": "Required. The facet key specification."
+        },
+        "limit": {
+          "description": "Maximum of facet values that should be returned for this facet. If unspecified, defaults to 20. The maximum allowed value is 300. Values above 300 will be coerced to 300. If this field is negative, an INVALID_ARGUMENT is returned.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchRequestFacetSpecFacetKey": {
+      "description": "Specifies how a facet is computed.",
+      "id": "GoogleCloudRetailV2betaSearchRequestFacetSpecFacetKey",
+      "properties": {
+        "contains": {
+          "description": "Only get facet values that contains the given strings. For example, suppose \"categories\" has three values \"Women > Shoe\", \"Women > Dress\" and \"Men > Shoe\". If set \"contains\" to \"Shoe\", the \"categories\" facet will give only \"Women > Shoe\" and \"Men > Shoe\". Only supported on textual fields. Maximum is 10.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "intervals": {
+          "description": "Set only if values should be bucketized into intervals. Must be set for facets with numerical values. Must not be set for facet with text values. Maximum number of intervals is 30.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaInterval"
+          },
+          "type": "array"
+        },
+        "key": {
+          "description": "Required. Supported textual and numerical facet keys in Product object, over which the facet values are computed. Facet key is case-sensitive. Allowed facet keys when FacetKey.query is not specified: * textual_field = *# The Product.brands. * \"brands\"; *# The Product.categories. * \"categories\"; *# The Audience.genders. * | \"genders\"; *# The Audience.age_groups. * | \"ageGroups\"; *# The Product.availability. Value is one of * *# \"IN_STOCK\", \"OUT_OF_STOCK\", PREORDER\", \"BACKORDER\". * | \"availability\"; *# The ColorInfo.color_families. * | \"colorFamilies\"; *# The ColorInfo.colors. * | \"colors\"; *# The Product.sizes. * | \"sizes\"; *# The Product.materials. * | \"materials\"; *# The Product.patterns. * | \"patterns\"; *# The Product.conditions. * | \"conditions\"; *# The textual custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are textual. * *# map. * | \"attributes.key\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.PICKUP_IN_STORE. * | \"pickupInStore\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SHIP_TO_STORE. * | \"shipToStore\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.SAME_DAY_DELIVERY. * | \"sameDayDelivery\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.NEXT_DAY_DELIVERY. * | \"nextDayDelivery\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_1. * | \"customFulfillment1\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_2. * | \"customFulfillment2\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_3. * | \"customFulfillment3\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_4. * | \"customFulfillment4\"; *# The FulfillmentInfo.ids for type *# FulfillmentInfo.Type.CUSTOM_TYPE_5. * | \"customFulfillment5\"; * numerical_field = *# The PriceInfo.price. * \"price\"; *# The discount. Computed by (original_price-price)/price * \"discount\"; *# The Rating.average_rating. * \"rating\"; *# The Rating.rating_count. * \"ratingCount\"; *# The numerical custom attribute in Product object. Key can * *# be any key in the Product.attributes map * *# if the attribute values are numerical. * | \"attributes.key\";",
+          "type": "string"
+        },
+        "orderBy": {
+          "description": "The order in which Facet.values are returned. Allowed values are: * \"count desc\", which means order by Facet.FacetValue.count descending. * \"value desc\", which means order by Facet.FacetValue.value descending. Only applies to textual facets. If not set, textual values are sorted in [natural order](https://en.wikipedia.org/wiki/Natural_sort_order); numerical intervals are sorted in the order given by FacetSpec.FacetKey.intervals; FulfillmentInfo.ids are sorted in the order given by FacetSpec.FacetKey.restricted_values.",
+          "type": "string"
+        },
+        "prefixes": {
+          "description": "Only get facet values that start with the given string prefix. For example, suppose \"categories\" has three values \"Women > Shoe\", \"Women > Dress\" and \"Men > Shoe\". If set \"prefixes\" to \"Women\", the \"categories\" facet will give only \"Women > Shoe\" and \"Women > Dress\". Only supported on textual fields. Maximum is 10.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "query": {
+          "description": "The query that is used to compute facet for the given facet key. When provided, it will override the default behavior of facet computation. The query syntax is the same as a filter expression. See SearchRequest.filter for detail syntax and limitations. Notice that there is no limitation on FacetKey.key when query is specified. In the response, FacetValue.value will be always \"1\" and FacetValue.count will be the number of results that matches the query. For example, you can set a customized facet for \"shipToStore\", where FacetKey.key is \"customizedShipToStore\", and FacetKey.query is \"availability: ANY(\\\"IN_STOCK\\\") AND shipToStore: ANY(\\\"123\\\")\". Then the facet will count the products that are both in stock and ship to store \"123\".",
+          "type": "string"
+        },
+        "restrictedValues": {
+          "description": "Only get facet for the given restricted values. For example, when using \"pickupInStore\" as key and set restricted values to [\"store123\", \"store456\"], only facets for \"store123\" and \"store456\" are returned. Only supported on textual fields and fulfillments. Maximum is 20. Must be set for the fulfillment facet keys: * pickupInStore * shipToStore * sameDayDelivery * nextDayDelivery * customFulfillment1 * customFulfillment2 * customFulfillment3 * customFulfillment4 * customFulfillment5",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchRequestQueryExpansionSpec": {
+      "description": "Specification to determine under which conditions query expansion should occur.",
+      "id": "GoogleCloudRetailV2betaSearchRequestQueryExpansionSpec",
+      "properties": {
+        "condition": {
+          "description": "The condition under which query expansion should occur. Default to Condition.DISABLED.",
+          "enum": [
+            "CONDITION_UNSPECIFIED",
+            "DISABLED",
+            "AUTO"
+          ],
+          "enumDescriptions": [
+            "Unspecified query expansion condition. This defaults to Condition.DISABLED.",
+            "Disabled query expansion. Only the exact search query is used, even if SearchResponse.total_size is zero.",
+            "Automatic query expansion built by Google Retail Search."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchResponse": {
+      "description": "Response message for SearchService.Search method.",
+      "id": "GoogleCloudRetailV2betaSearchResponse",
+      "properties": {
+        "attributionToken": {
+          "description": "A unique search token. This should be included in the UserEvent logs resulting from this search, which enables accurate attribution of search model performance.",
+          "type": "string"
+        },
+        "correctedQuery": {
+          "description": "If spell correction applies, the corrected query. Otherwise, empty.",
+          "type": "string"
+        },
+        "facets": {
+          "description": "Results of facets requested by user.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaSearchResponseFacet"
+          },
+          "type": "array"
+        },
+        "nextPageToken": {
+          "description": "A token that can be sent as SearchRequest.page_token to retrieve the next page. If this field is omitted, there are no subsequent pages.",
+          "type": "string"
+        },
+        "queryExpansionInfo": {
+          "$ref": "GoogleCloudRetailV2betaSearchResponseQueryExpansionInfo",
+          "description": "Query expansion information for the returned results."
+        },
+        "redirectUri": {
+          "description": "The URI of a customer-defined redirect page. If redirect action is triggered, no search will be performed, and only redirect_uri and attribution_token will be set in the response.",
+          "type": "string"
+        },
+        "results": {
+          "description": "A list of matched items. The order represents the ranking.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaSearchResponseSearchResult"
+          },
+          "type": "array"
+        },
+        "totalSize": {
+          "description": "The estimated total count of matched items irrespective of pagination. The count of results returned by pagination may be less than the total_size that matches.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchResponseFacet": {
+      "description": "A facet result.",
+      "id": "GoogleCloudRetailV2betaSearchResponseFacet",
+      "properties": {
+        "dynamicFacet": {
+          "description": "Whether the facet is dynamically generated.",
+          "type": "boolean"
+        },
+        "key": {
+          "description": "The key for this facet. E.g., \"colorFamilies\" or \"price\" or \"attributes.attr1\".",
+          "type": "string"
+        },
+        "values": {
+          "description": "The facet values for this field.",
+          "items": {
+            "$ref": "GoogleCloudRetailV2betaSearchResponseFacetFacetValue"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchResponseFacetFacetValue": {
+      "description": "A facet value which contains value names and their count.",
+      "id": "GoogleCloudRetailV2betaSearchResponseFacetFacetValue",
+      "properties": {
+        "count": {
+          "description": "Number of items that have this facet value.",
+          "format": "int64",
+          "type": "string"
+        },
+        "interval": {
+          "$ref": "GoogleCloudRetailV2betaInterval",
+          "description": "Interval value for a facet, such as [10, 20) for facet \"price\"."
+        },
+        "value": {
+          "description": "Text value of a facet, such as \"Black\" for facet \"colorFamilies\".",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchResponseQueryExpansionInfo": {
+      "description": "Information describing query expansion including whether expansion has occurred.",
+      "id": "GoogleCloudRetailV2betaSearchResponseQueryExpansionInfo",
+      "properties": {
+        "expandedQuery": {
+          "description": "Bool describing whether query expansion has occurred.",
+          "type": "boolean"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSearchResponseSearchResult": {
+      "description": "Represents the search results.",
+      "id": "GoogleCloudRetailV2betaSearchResponseSearchResult",
+      "properties": {
+        "id": {
+          "description": "Product.id of the searched Product.",
+          "type": "string"
+        },
+        "matchingVariantCount": {
+          "description": "The count of matched variant Products.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "matchingVariantFields": {
+          "additionalProperties": {
+            "format": "google-fieldmask",
+            "type": "string"
+          },
+          "description": "If a variant Product matches the search query, this map indicates which Product fields are matched. The key is the Product.name, the value is a field mask of the matched Product fields. If matched attributes cannot be determined, this map will be empty. For example, a key \"sku1\" with field mask \"products.color_info\" indicates there is a match between \"sku1\" ColorInfo and the query.",
+          "type": "object"
+        },
+        "product": {
+          "$ref": "GoogleCloudRetailV2betaProduct",
+          "description": "The product data snippet in the search response. Only Product.name is guaranteed to be populated. Product.variants contains the product variants that match the search query. If there are multiple product variants matching the query, top 5 most relevant product variants are returned and ordered by relevancy. If relevancy can be deternmined, use matching_variant_fields to look up matched product variants fields. If relevancy cannot be determined, e.g. when searching \"shoe\" all products in a shoe product can be a match, 5 product variants are returned but order is meaningless."
+        },
+        "variantRollupValues": {
+          "additionalProperties": {
+            "type": "any"
+          },
+          "description": "The rollup matching variant Product attributes. The key is one of the SearchRequest.variant_rollup_keys. The values are the merged and de-duplicated Product attributes. Notice that the rollup values are respect filter. For example, when filtering by \"colorFamilies:ANY(\\\"red\\\")\" and rollup \"colorFamilies\", only \"red\" is returned. For textual and numerical attributes, the rollup values is a list of string or double values with type google.protobuf.ListValue. For example, if there are two variants with colors \"red\" and \"blue\", the rollup values are { key: \"colorFamilies\" value { list_value { values { string_value: \"red\" } values { string_value: \"blue\" } } } } For Product.fulfillment_info, the rollup values is a double value with type google.protobuf.Value. For example, {key: \"pickupInStore.store1\" value { number_value: 10 }} means a there are 10 variants in this product are available in the store \"store1\".",
+          "type": "object"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSetDefaultBranchRequest": {
+      "description": "Request message to set a specified branch as new default_branch.",
+      "id": "GoogleCloudRetailV2betaSetDefaultBranchRequest",
+      "properties": {
+        "branchId": {
+          "description": "The final component of the resource name of a branch. This field must be one of \"0\", \"1\" or \"2\". Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "note": {
+          "description": "Some note on this request, this can be retrieved by CatalogService.GetDefaultBranch before next valid default branch set occurs. This field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSetInventoryMetadata": {
+      "description": "Metadata related to the progress of the SetInventory operation. Currently empty because there is no meaningful metadata populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2betaSetInventoryMetadata",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSetInventoryRequest": {
+      "description": "Request message for SetInventory method.",
+      "id": "GoogleCloudRetailV2betaSetInventoryRequest",
+      "properties": {
+        "allowMissing": {
+          "description": "If set to true, and the Product with name Product.name is not found, the inventory update will still be processed and retained for at most 1 day until the Product is created. If set to false, an INVALID_ARGUMENT error is returned if the Product is not found.",
+          "type": "boolean"
+        },
+        "inventory": {
+          "$ref": "GoogleCloudRetailV2betaProduct",
+          "description": "Required. The inventory information to update. The allowable fields to update are: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info The updated inventory fields must be specified in SetInventoryRequest.set_mask. If SetInventoryRequest.inventory.name is empty or invalid, an INVALID_ARGUMENT error is returned. If the caller does not have permission to update the Product named in Product.name, regardless of whether or not it exists, a PERMISSION_DENIED error is returned. If the Product to update does not have existing inventory information, the provided inventory information will be inserted. If the Product to update has existing inventory information, the provided inventory information will be merged while respecting the last update time for each inventory field, using the provided or default value for SetInventoryRequest.set_time. The last update time is recorded for the following inventory fields: * Product.price_info * Product.availability * Product.available_quantity * Product.fulfillment_info If a full overwrite of inventory information while ignoring timestamps is needed, UpdateProduct should be invoked instead."
+        },
+        "setMask": {
+          "description": "Indicates which inventory fields in the provided Product to update. If not set or set with empty paths, all inventory fields will be updated. If an unsupported or unknown field is provided, an INVALID_ARGUMENT error is returned and the entire update will be ignored.",
+          "format": "google-fieldmask",
+          "type": "string"
+        },
+        "setTime": {
+          "description": "The time when the request is issued, used to prevent out-of-order updates on inventory fields with the last update time recorded. If not provided, the internal system time will be used.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRetailV2betaSetInventoryResponse": {
+      "description": "Response of the SetInventoryRequest. Currently empty because there is no meaningful response populated from the SetInventory method.",
+      "id": "GoogleCloudRetailV2betaSetInventoryResponse",
+      "properties": {},
+      "type": "object"
+    },
     "GoogleCloudRetailV2betaUserEvent": {
       "description": "UserEvent captures all metadata information Retail API needs to know about how end users interact with customers' website.",
       "id": "GoogleCloudRetailV2betaUserEvent",
@@ -1887,13 +3247,17 @@
           "type": "object"
         },
         "attributionToken": {
-          "description": "Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K's page. When recording events on product K's page, log the PredictResponse.attribution_token to this field.",
+          "description": "Highly recommended for user events that are the result of PredictionService.Predict. This field enables accurate attribution of recommendation model performance. The value must be a valid PredictResponse.attribution_token for user events that are the result of PredictionService.Predict. The value must be a valid SearchResponse.attribution_token for user events that are the result of SearchService.Search. This token enables us to accurately attribute page view or purchase back to the event and the particular predict response containing this clicked/purchased product. If user clicks on product K in the recommendation results, pass PredictResponse.attribution_token as a URL parameter to product K's page. When recording events on product K's page, log the PredictResponse.attribution_token to this field.",
           "type": "string"
         },
         "cartId": {
           "description": "The id or name of the associated shopping cart. This id is used to associate multiple items added or present in the cart before purchase. This can only be set for `add-to-cart`, `purchase-complete`, or `shopping-cart-page-view` events.",
           "type": "string"
         },
+        "completionDetail": {
+          "$ref": "GoogleCloudRetailV2betaCompletionDetail",
+          "description": "The main completion details related to the event. In a `completion` event, this field represents the completions returned to the end user and the clicked completion by the end user. In a `search` event, it represents the search event happens after clicking completion."
+        },
         "eventTime": {
           "description": "Only required for UserEventService.ImportUserEvents method. Timestamp of when the user event happened.",
           "format": "google-datetime",
@@ -1910,6 +3274,19 @@
           },
           "type": "array"
         },
+        "filter": {
+          "description": "The filter syntax consists of an expression language for constructing a predicate from one or more fields of the products being filtered. See SearchRequest.filter for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "offset": {
+          "description": "An integer that specifies the current offset for pagination (the 0-indexed starting location, amongst the products deemed by the API as relevant). See SearchRequest.offset for definition. If this field is negative, an INVALID_ARGUMENT is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "orderBy": {
+          "description": "The order in which products are returned. See SearchRequest.order_by for definition and syntax. The value must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This can only be set for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
         "pageCategories": {
           "description": "The categories associated with a category page. To represent full path of category, use '>' sign to separate different hierarchies. If '>' is part of the category name, please replace it with other character(s). Category pages include special pages such as sales or promotions. For instance, a special sale page may have the category hierarchy: \"pageCategories\" : [\"Sales > 2017 Black Friday Deals\"]. Required for `category-page-view` events. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
           "items": {
@@ -1937,7 +3314,11 @@
           "type": "string"
         },
         "searchQuery": {
-          "description": "The user's search query. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "description": "The user's search query. See SearchRequest.query for definition. The value must be a UTF-8 encoded string with a length limit of 5,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. At least one of search_query or page_categories is required for `search` events. Other event types should not set this field. Otherwise, an INVALID_ARGUMENT error is returned.",
+          "type": "string"
+        },
+        "sessionId": {
+          "description": "A unique identifier for tracking a visitor session with a length limit of 128 bytes. A session is an aggregation of an end user behavior in a time span. A general guideline to populate the sesion_id: 1. If user has no activity for 30 min, a new session_id should be assigned. 2. The session_id should be unique across users, suggest use uuid or add visitor_id as prefix.",
           "type": "string"
         },
         "uri": {
@@ -2014,11 +3395,11 @@
           "type": "boolean"
         },
         "ipAddress": {
-          "description": "The end user's IP address. Required for getting SearchRespons.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. \"104.133.9.80\") or an IPv6 address (e.g. \"2001:0db8:85a3:0000:0000:8a2e:0370:7334\"). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
+          "description": "The end user's IP address. Required for getting SearchResponse.sponsored_results. This field is used to extract location information for personalization. This field must be either an IPv4 address (e.g. \"104.133.9.80\") or an IPv6 address (e.g. \"2001:0db8:85a3:0000:0000:8a2e:0370:7334\"). Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
           "type": "string"
         },
         "userAgent": {
-          "description": "User agent as included in the HTTP header. Required for getting SearchRespons.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
+          "description": "User agent as included in the HTTP header. Required for getting SearchResponse.sponsored_results. The field must be a UTF-8 encoded string with a length limit of 1,000 characters. Otherwise, an INVALID_ARGUMENT error is returned. This should not be set when using the client side event reporting with GTM or JavaScript tag in UserEventService.CollectUserEvent or if direct_user_request is set.",
           "type": "string"
         },
         "userId": {
@@ -2113,6 +3494,28 @@
         }
       },
       "type": "object"
+    },
+    "GoogleTypeDate": {
+      "description": "Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values * A month and day value, with a zero year, such as an anniversary * A year on its own, with zero month and day values * A year and month value, with a zero day, such as a credit card expiration date Related types are google.type.TimeOfDay and `google.protobuf.Timestamp`.",
+      "id": "GoogleTypeDate",
+      "properties": {
+        "day": {
+          "description": "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "month": {
+          "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "year": {
+          "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "type": "object"
     }
   },
   "servicePath": "",
diff --git a/googleapiclient/discovery_cache/documents/run.v1.json b/googleapiclient/discovery_cache/documents/run.v1.json
index 36e5de5..a73fafd 100644
--- a/googleapiclient/discovery_cache/documents/run.v1.json
+++ b/googleapiclient/discovery_cache/documents/run.v1.json
@@ -184,7 +184,7 @@
               ],
               "parameters": {
                 "continue": {
-                  "description": "Optional encoded string to continue paging.",
+                  "description": "Optional. Encoded string to continue paging.",
                   "location": "query",
                   "type": "string"
                 },
@@ -204,7 +204,7 @@
                   "type": "string"
                 },
                 "limit": {
-                  "description": "The maximum number of records that should be returned.",
+                  "description": "Optional. The maximum number of records that should be returned.",
                   "format": "int32",
                   "location": "query",
                   "type": "integer"
@@ -352,7 +352,7 @@
               ],
               "parameters": {
                 "continue": {
-                  "description": "Optional encoded string to continue paging.",
+                  "description": "Optional. Encoded string to continue paging.",
                   "location": "query",
                   "type": "string"
                 },
@@ -372,7 +372,7 @@
                   "type": "string"
                 },
                 "limit": {
-                  "description": "The maximum number of records that should be returned.",
+                  "description": "Optional. The maximum number of records that should be returned.",
                   "format": "int32",
                   "location": "query",
                   "type": "integer"
@@ -487,7 +487,7 @@
               ],
               "parameters": {
                 "continue": {
-                  "description": "Optional encoded string to continue paging.",
+                  "description": "Optional. Encoded string to continue paging.",
                   "location": "query",
                   "type": "string"
                 },
@@ -507,7 +507,7 @@
                   "type": "string"
                 },
                 "limit": {
-                  "description": "The maximum number of records that should be returned.",
+                  "description": "Optional. The maximum number of records that should be returned.",
                   "format": "int32",
                   "location": "query",
                   "type": "integer"
@@ -577,7 +577,7 @@
               ],
               "parameters": {
                 "continue": {
-                  "description": "Optional encoded string to continue paging.",
+                  "description": "Optional. Encoded string to continue paging.",
                   "location": "query",
                   "type": "string"
                 },
@@ -597,7 +597,7 @@
                   "type": "string"
                 },
                 "limit": {
-                  "description": "The maximum number of records that should be returned.",
+                  "description": "Optional. The maximum number of records that should be returned.",
                   "format": "int32",
                   "location": "query",
                   "type": "integer"
@@ -745,7 +745,7 @@
               ],
               "parameters": {
                 "continue": {
-                  "description": "Optional encoded string to continue paging.",
+                  "description": "Optional. Encoded string to continue paging.",
                   "location": "query",
                   "type": "string"
                 },
@@ -765,7 +765,7 @@
                   "type": "string"
                 },
                 "limit": {
-                  "description": "The maximum number of records that should be returned.",
+                  "description": "Optional. The maximum number of records that should be returned.",
                   "format": "int32",
                   "location": "query",
                   "type": "integer"
@@ -997,7 +997,7 @@
                   ],
                   "parameters": {
                     "continue": {
-                      "description": "Optional encoded string to continue paging.",
+                      "description": "Optional. Encoded string to continue paging.",
                       "location": "query",
                       "type": "string"
                     },
@@ -1017,7 +1017,7 @@
                       "type": "string"
                     },
                     "limit": {
-                      "description": "The maximum number of records that should be returned.",
+                      "description": "Optional. The maximum number of records that should be returned.",
                       "format": "int32",
                       "location": "query",
                       "type": "integer"
@@ -1165,7 +1165,7 @@
                   ],
                   "parameters": {
                     "continue": {
-                      "description": "Optional encoded string to continue paging.",
+                      "description": "Optional. Encoded string to continue paging.",
                       "location": "query",
                       "type": "string"
                     },
@@ -1185,7 +1185,7 @@
                       "type": "string"
                     },
                     "limit": {
-                      "description": "The maximum number of records that should be returned.",
+                      "description": "Optional. The maximum number of records that should be returned.",
                       "format": "int32",
                       "location": "query",
                       "type": "integer"
@@ -1300,7 +1300,7 @@
                   ],
                   "parameters": {
                     "continue": {
-                      "description": "Optional encoded string to continue paging.",
+                      "description": "Optional. Encoded string to continue paging.",
                       "location": "query",
                       "type": "string"
                     },
@@ -1320,7 +1320,7 @@
                       "type": "string"
                     },
                     "limit": {
-                      "description": "The maximum number of records that should be returned.",
+                      "description": "Optional. The maximum number of records that should be returned.",
                       "format": "int32",
                       "location": "query",
                       "type": "integer"
@@ -1390,7 +1390,7 @@
                   ],
                   "parameters": {
                     "continue": {
-                      "description": "Optional encoded string to continue paging.",
+                      "description": "Optional. Encoded string to continue paging.",
                       "location": "query",
                       "type": "string"
                     },
@@ -1410,7 +1410,7 @@
                       "type": "string"
                     },
                     "limit": {
-                      "description": "The maximum number of records that should be returned.",
+                      "description": "Optional. The maximum number of records that should be returned.",
                       "format": "int32",
                       "location": "query",
                       "type": "integer"
@@ -1589,7 +1589,7 @@
                   ],
                   "parameters": {
                     "continue": {
-                      "description": "Optional encoded string to continue paging.",
+                      "description": "Optional. Encoded string to continue paging.",
                       "location": "query",
                       "type": "string"
                     },
@@ -1609,7 +1609,7 @@
                       "type": "string"
                     },
                     "limit": {
-                      "description": "The maximum number of records that should be returned.",
+                      "description": "Optional. The maximum number of records that should be returned.",
                       "format": "int32",
                       "location": "query",
                       "type": "integer"
@@ -1736,7 +1736,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210716",
   "rootUrl": "https://run.googleapis.com/",
   "schemas": {
     "Addressable": {
@@ -2164,7 +2164,7 @@
           "type": "array"
         },
         "url": {
-          "description": "Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping. +optional",
+          "description": "Optional. Cloud Run fully managed: not supported Cloud Run on GKE: supported Holds the URL that will serve the traffic of the DomainMapping.",
           "type": "string"
         }
       },
@@ -2891,7 +2891,7 @@
       "id": "RevisionSpec",
       "properties": {
         "containerConcurrency": {
-          "description": "(Optional) ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.",
+          "description": "Optional. ContainerConcurrency specifies the maximum allowed in-flight (concurrent) requests per container instance of the Revision. Cloud Run fully managed: supported, defaults to 80 Cloud Run for Anthos: supported, defaults to 0, which means concurrency to the application is not limited, and the system decides the target concurrency for the autoscaler.",
           "format": "int32",
           "type": "integer"
         },
@@ -2936,7 +2936,7 @@
           "type": "string"
         },
         "logUrl": {
-          "description": "Specifies the generated logging url for this particular revision based on the revision url template specified in the controller's config. +optional",
+          "description": "Optional. Specifies the generated logging url for this particular revision based on the revision url template specified in the controller's config.",
           "type": "string"
         },
         "observedGeneration": {
@@ -3364,7 +3364,7 @@
           "type": "string"
         },
         "latestRevision": {
-          "description": "LatestRevision may be optionally provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty. +optional",
+          "description": "Optional. LatestRevision may be provided to indicate that the latest ready Revision of the Configuration should be used for this traffic target. When provided LatestRevision must be true if RevisionName is empty; it must be false when RevisionName is non-empty.",
           "type": "boolean"
         },
         "percent": {
@@ -3377,7 +3377,7 @@
           "type": "string"
         },
         "tag": {
-          "description": "Tag is optionally used to expose a dedicated url for referencing this target exclusively. +optional",
+          "description": "Optional. Tag is used to expose a dedicated url for referencing this target exclusively.",
           "type": "string"
         },
         "url": {
diff --git a/googleapiclient/discovery_cache/documents/run.v1alpha1.json b/googleapiclient/discovery_cache/documents/run.v1alpha1.json
index 3da6051..4f3baf7 100644
--- a/googleapiclient/discovery_cache/documents/run.v1alpha1.json
+++ b/googleapiclient/discovery_cache/documents/run.v1alpha1.json
@@ -268,7 +268,7 @@
       }
     }
   },
-  "revision": "20210628",
+  "revision": "20210716",
   "rootUrl": "https://run.googleapis.com/",
   "schemas": {
     "ConfigMapEnvSource": {
diff --git a/googleapiclient/discovery_cache/documents/runtimeconfig.v1.json b/googleapiclient/discovery_cache/documents/runtimeconfig.v1.json
index 43ed704..1151a3e 100644
--- a/googleapiclient/discovery_cache/documents/runtimeconfig.v1.json
+++ b/googleapiclient/discovery_cache/documents/runtimeconfig.v1.json
@@ -210,7 +210,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210726",
   "rootUrl": "https://runtimeconfig.googleapis.com/",
   "schemas": {
     "CancelOperationRequest": {
diff --git a/googleapiclient/discovery_cache/documents/runtimeconfig.v1beta1.json b/googleapiclient/discovery_cache/documents/runtimeconfig.v1beta1.json
index 13d44ce..66d4558 100644
--- a/googleapiclient/discovery_cache/documents/runtimeconfig.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/runtimeconfig.v1beta1.json
@@ -805,7 +805,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210719",
   "rootUrl": "https://runtimeconfig.googleapis.com/",
   "schemas": {
     "Binding": {
diff --git a/googleapiclient/discovery_cache/documents/safebrowsing.v4.json b/googleapiclient/discovery_cache/documents/safebrowsing.v4.json
index 451bae8..dc8b152 100644
--- a/googleapiclient/discovery_cache/documents/safebrowsing.v4.json
+++ b/googleapiclient/discovery_cache/documents/safebrowsing.v4.json
@@ -261,7 +261,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210721",
   "rootUrl": "https://safebrowsing.googleapis.com/",
   "schemas": {
     "GoogleProtobufEmpty": {
diff --git a/googleapiclient/discovery_cache/documents/script.v1.json b/googleapiclient/discovery_cache/documents/script.v1.json
index fe4fa71..e2db03c 100644
--- a/googleapiclient/discovery_cache/documents/script.v1.json
+++ b/googleapiclient/discovery_cache/documents/script.v1.json
@@ -887,7 +887,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210717",
   "rootUrl": "https://script.googleapis.com/",
   "schemas": {
     "Content": {
diff --git a/googleapiclient/discovery_cache/documents/searchconsole.v1.json b/googleapiclient/discovery_cache/documents/searchconsole.v1.json
index af51e00..d0cd09c 100644
--- a/googleapiclient/discovery_cache/documents/searchconsole.v1.json
+++ b/googleapiclient/discovery_cache/documents/searchconsole.v1.json
@@ -373,7 +373,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://searchconsole.googleapis.com/",
   "schemas": {
     "ApiDataRow": {
diff --git a/googleapiclient/discovery_cache/documents/secretmanager.v1.json b/googleapiclient/discovery_cache/documents/secretmanager.v1.json
index 24a6579..7c7e83f 100644
--- a/googleapiclient/discovery_cache/documents/secretmanager.v1.json
+++ b/googleapiclient/discovery_cache/documents/secretmanager.v1.json
@@ -643,7 +643,7 @@
       }
     }
   },
-  "revision": "20210710",
+  "revision": "20210716",
   "rootUrl": "https://secretmanager.googleapis.com/",
   "schemas": {
     "AccessSecretVersionResponse": {
diff --git a/googleapiclient/discovery_cache/documents/secretmanager.v1beta1.json b/googleapiclient/discovery_cache/documents/secretmanager.v1beta1.json
index 7b7d9c9..1117795 100644
--- a/googleapiclient/discovery_cache/documents/secretmanager.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/secretmanager.v1beta1.json
@@ -628,7 +628,7 @@
       }
     }
   },
-  "revision": "20210710",
+  "revision": "20210716",
   "rootUrl": "https://secretmanager.googleapis.com/",
   "schemas": {
     "AccessSecretVersionResponse": {
diff --git a/googleapiclient/discovery_cache/documents/securitycenter.v1.json b/googleapiclient/discovery_cache/documents/securitycenter.v1.json
index 880b920..01047d8 100644
--- a/googleapiclient/discovery_cache/documents/securitycenter.v1.json
+++ b/googleapiclient/discovery_cache/documents/securitycenter.v1.json
@@ -1816,7 +1816,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://securitycenter.googleapis.com/",
   "schemas": {
     "Asset": {
@@ -2023,6 +2023,28 @@
           "description": "The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.",
           "type": "string"
         },
+        "findingClass": {
+          "description": "The class of the finding.",
+          "enum": [
+            "FINDING_CLASS_UNSPECIFIED",
+            "THREAT",
+            "VULNERABILITY",
+            "MISCONFIGURATION",
+            "OBSERVATION"
+          ],
+          "enumDescriptions": [
+            "Unspecified finding class.",
+            "Describes unwanted or malicious activity.",
+            "Describes a potential weakness in software that increases risk to Confidentiality & Integrity & Availability.",
+            "Describes a potential weakness in cloud resource/asset configuration that increases risk.",
+            "Describes a security observation that is for informational purposes."
+          ],
+          "type": "string"
+        },
+        "indicator": {
+          "$ref": "Indicator",
+          "description": "Represents what's commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise"
+        },
         "name": {
           "description": "The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: \"organizations/{organization_id}/sources/{source_id}/findings/{finding_id}\"",
           "type": "string"
@@ -2588,6 +2610,27 @@
       },
       "type": "object"
     },
+    "Indicator": {
+      "description": "Represents what's commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise",
+      "id": "Indicator",
+      "properties": {
+        "domains": {
+          "description": "List of domains associated to the Finding.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "ipAddresses": {
+          "description": "List of ip addresses associated to the Finding.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "ListAssetsResponse": {
       "description": "Response message for listing assets.",
       "id": "ListAssetsResponse",
diff --git a/googleapiclient/discovery_cache/documents/securitycenter.v1beta1.json b/googleapiclient/discovery_cache/documents/securitycenter.v1beta1.json
index 1427c0e..885ddcb 100644
--- a/googleapiclient/discovery_cache/documents/securitycenter.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/securitycenter.v1beta1.json
@@ -896,7 +896,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://securitycenter.googleapis.com/",
   "schemas": {
     "Asset": {
@@ -1094,6 +1094,28 @@
           "description": "The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.",
           "type": "string"
         },
+        "findingClass": {
+          "description": "The class of the finding.",
+          "enum": [
+            "FINDING_CLASS_UNSPECIFIED",
+            "THREAT",
+            "VULNERABILITY",
+            "MISCONFIGURATION",
+            "OBSERVATION"
+          ],
+          "enumDescriptions": [
+            "Unspecified finding class.",
+            "Describes unwanted or malicious activity.",
+            "Describes a potential weakness in software that increases risk to Confidentiality & Integrity & Availability.",
+            "Describes a potential weakness in cloud resource/asset configuration that increases risk.",
+            "Describes a security observation that is for informational purposes."
+          ],
+          "type": "string"
+        },
+        "indicator": {
+          "$ref": "Indicator",
+          "description": "Represents what's commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise"
+        },
         "name": {
           "description": "The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: \"organizations/{organization_id}/sources/{source_id}/findings/{finding_id}\"",
           "type": "string"
@@ -1714,6 +1736,27 @@
       },
       "type": "object"
     },
+    "Indicator": {
+      "description": "Represents what's commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise",
+      "id": "Indicator",
+      "properties": {
+        "domains": {
+          "description": "List of domains associated to the Finding.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "ipAddresses": {
+          "description": "List of ip addresses associated to the Finding.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "ListAssetsResponse": {
       "description": "Response message for listing assets.",
       "id": "ListAssetsResponse",
diff --git a/googleapiclient/discovery_cache/documents/securitycenter.v1beta2.json b/googleapiclient/discovery_cache/documents/securitycenter.v1beta2.json
index 44c5a47..af088a4 100644
--- a/googleapiclient/discovery_cache/documents/securitycenter.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/securitycenter.v1beta2.json
@@ -1328,7 +1328,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://securitycenter.googleapis.com/",
   "schemas": {
     "Config": {
@@ -1508,6 +1508,28 @@
           "description": "The URI that, if available, points to a web page outside of Security Command Center where additional information about the finding can be found. This field is guaranteed to be either empty or a well formed URL.",
           "type": "string"
         },
+        "findingClass": {
+          "description": "The class of the finding.",
+          "enum": [
+            "FINDING_CLASS_UNSPECIFIED",
+            "THREAT",
+            "VULNERABILITY",
+            "MISCONFIGURATION",
+            "OBSERVATION"
+          ],
+          "enumDescriptions": [
+            "Unspecified finding class.",
+            "Describes unwanted or malicious activity.",
+            "Describes a potential weakness in software that increases risk to Confidentiality & Integrity & Availability.",
+            "Describes a potential weakness in cloud resource/asset configuration that increases risk.",
+            "Describes a security observation that is for informational purposes."
+          ],
+          "type": "string"
+        },
+        "indicator": {
+          "$ref": "Indicator",
+          "description": "Represents what's commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise"
+        },
         "name": {
           "description": "The relative resource name of this finding. See: https://cloud.google.com/apis/design/resource_names#relative_resource_name Example: \"organizations/{organization_id}/sources/{source_id}/findings/{finding_id}\"",
           "type": "string"
@@ -1896,6 +1918,27 @@
       },
       "type": "object"
     },
+    "Indicator": {
+      "description": "Represents what's commonly known as an Indicator of compromise (IoC) in computer forensics. This is an artifact observed on a network or in an operating system that, with high confidence, indicates a computer intrusion. Reference: https://en.wikipedia.org/wiki/Indicator_of_compromise",
+      "id": "Indicator",
+      "properties": {
+        "domains": {
+          "description": "List of domains associated to the Finding.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "ipAddresses": {
+          "description": "List of ip addresses associated to the Finding.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "SecurityCenterSettings": {
       "description": "Resource capturing the settings for Security Center.",
       "id": "SecurityCenterSettings",
diff --git a/googleapiclient/discovery_cache/documents/serviceconsumermanagement.v1.json b/googleapiclient/discovery_cache/documents/serviceconsumermanagement.v1.json
index 88f953b..dd76f10 100644
--- a/googleapiclient/discovery_cache/documents/serviceconsumermanagement.v1.json
+++ b/googleapiclient/discovery_cache/documents/serviceconsumermanagement.v1.json
@@ -542,7 +542,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://serviceconsumermanagement.googleapis.com/",
   "schemas": {
     "AddTenantProjectRequest": {
diff --git a/googleapiclient/discovery_cache/documents/serviceconsumermanagement.v1beta1.json b/googleapiclient/discovery_cache/documents/serviceconsumermanagement.v1beta1.json
index 8a34f48..49ffa12 100644
--- a/googleapiclient/discovery_cache/documents/serviceconsumermanagement.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/serviceconsumermanagement.v1beta1.json
@@ -500,7 +500,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://serviceconsumermanagement.googleapis.com/",
   "schemas": {
     "Api": {
diff --git a/googleapiclient/discovery_cache/documents/servicedirectory.v1.json b/googleapiclient/discovery_cache/documents/servicedirectory.v1.json
index a78dd8a..963806e 100644
--- a/googleapiclient/discovery_cache/documents/servicedirectory.v1.json
+++ b/googleapiclient/discovery_cache/documents/servicedirectory.v1.json
@@ -883,7 +883,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210716",
   "rootUrl": "https://servicedirectory.googleapis.com/",
   "schemas": {
     "Binding": {
@@ -926,7 +926,7 @@
           "additionalProperties": {
             "type": "string"
           },
-          "description": "Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.",
+          "description": "Optional. Annotations for the endpoint. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 512 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/) Annotations that fails to meet these requirements are rejected. Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.",
           "type": "object"
         },
         "name": {
@@ -1169,7 +1169,7 @@
           "additionalProperties": {
             "type": "string"
           },
-          "description": "Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system annotations managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.",
+          "description": "Optional. Annotations for the service. This data can be consumed by service clients. Restrictions: * The entire annotations dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Annotations that go beyond this limit are rejected * Valid annotation keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Annotations that fails to meet these requirements are rejected Note: This field is equivalent to the `metadata` field in the v1beta1 API. They have the same syntax and read/write to the same location in Service Directory.",
           "type": "object"
         },
         "endpoints": {
diff --git a/googleapiclient/discovery_cache/documents/servicedirectory.v1beta1.json b/googleapiclient/discovery_cache/documents/servicedirectory.v1beta1.json
index f819ef5..d9b7c65 100644
--- a/googleapiclient/discovery_cache/documents/servicedirectory.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/servicedirectory.v1beta1.json
@@ -883,7 +883,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210716",
   "rootUrl": "https://servicedirectory.googleapis.com/",
   "schemas": {
     "Binding": {
@@ -932,7 +932,7 @@
           "additionalProperties": {
             "type": "string"
           },
-          "description": "Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.",
+          "description": "Optional. Metadata for the endpoint. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 512 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.",
           "type": "object"
         },
         "name": {
@@ -1211,7 +1211,7 @@
           "additionalProperties": {
             "type": "string"
           },
-          "description": "Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected * The `(*.)google.com/` and `(*.)googleapis.com/` prefixes are reserved for system metadata managed by Service Directory. If the user tries to write to these keyspaces, those entries are silently ignored by the system Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.",
+          "description": "Optional. Metadata for the service. This data can be consumed by service clients. Restrictions: * The entire metadata dictionary may contain up to 2000 characters, spread accoss all key-value pairs. Metadata that goes beyond this limit are rejected * Valid metadata keys have two segments: an optional prefix and name, separated by a slash (/). The name segment is required and must be 63 characters or less, beginning and ending with an alphanumeric character ([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and alphanumerics between. The prefix is optional. If specified, the prefix must be a DNS subdomain: a series of DNS labels separated by dots (.), not longer than 253 characters in total, followed by a slash (/). Metadata that fails to meet these requirements are rejected Note: This field is equivalent to the `annotations` field in the v1 API. They have the same syntax and read/write to the same location in Service Directory.",
           "type": "object"
         },
         "name": {
diff --git a/googleapiclient/discovery_cache/documents/servicemanagement.v1.json b/googleapiclient/discovery_cache/documents/servicemanagement.v1.json
index 1178a2b..001a664 100644
--- a/googleapiclient/discovery_cache/documents/servicemanagement.v1.json
+++ b/googleapiclient/discovery_cache/documents/servicemanagement.v1.json
@@ -829,7 +829,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://servicemanagement.googleapis.com/",
   "schemas": {
     "Advice": {
diff --git a/googleapiclient/discovery_cache/documents/servicenetworking.v1.json b/googleapiclient/discovery_cache/documents/servicenetworking.v1.json
index 5eeb733..8bd3dc1 100644
--- a/googleapiclient/discovery_cache/documents/servicenetworking.v1.json
+++ b/googleapiclient/discovery_cache/documents/servicenetworking.v1.json
@@ -860,7 +860,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210721",
   "rootUrl": "https://servicenetworking.googleapis.com/",
   "schemas": {
     "AddDnsRecordSetMetadata": {
diff --git a/googleapiclient/discovery_cache/documents/servicenetworking.v1beta.json b/googleapiclient/discovery_cache/documents/servicenetworking.v1beta.json
index 6de3b7a..e91792b 100644
--- a/googleapiclient/discovery_cache/documents/servicenetworking.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/servicenetworking.v1beta.json
@@ -307,7 +307,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210721",
   "rootUrl": "https://servicenetworking.googleapis.com/",
   "schemas": {
     "AddDnsRecordSetMetadata": {
diff --git a/googleapiclient/discovery_cache/documents/serviceusage.v1.json b/googleapiclient/discovery_cache/documents/serviceusage.v1.json
index 301872a..8d328a8 100644
--- a/googleapiclient/discovery_cache/documents/serviceusage.v1.json
+++ b/googleapiclient/discovery_cache/documents/serviceusage.v1.json
@@ -426,7 +426,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://serviceusage.googleapis.com/",
   "schemas": {
     "AdminQuotaPolicy": {
diff --git a/googleapiclient/discovery_cache/documents/serviceusage.v1beta1.json b/googleapiclient/discovery_cache/documents/serviceusage.v1beta1.json
index 8338eda..b336712 100644
--- a/googleapiclient/discovery_cache/documents/serviceusage.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/serviceusage.v1beta1.json
@@ -959,7 +959,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://serviceusage.googleapis.com/",
   "schemas": {
     "AdminQuotaPolicy": {
diff --git a/googleapiclient/discovery_cache/documents/sheets.v4.json b/googleapiclient/discovery_cache/documents/sheets.v4.json
index ade1049..7e7d3cf 100644
--- a/googleapiclient/discovery_cache/documents/sheets.v4.json
+++ b/googleapiclient/discovery_cache/documents/sheets.v4.json
@@ -870,7 +870,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210719",
   "rootUrl": "https://sheets.googleapis.com/",
   "schemas": {
     "AddBandingRequest": {
diff --git a/googleapiclient/discovery_cache/documents/slides.v1.json b/googleapiclient/discovery_cache/documents/slides.v1.json
index 8cc3656..8b7688b 100644
--- a/googleapiclient/discovery_cache/documents/slides.v1.json
+++ b/googleapiclient/discovery_cache/documents/slides.v1.json
@@ -313,7 +313,7 @@
       }
     }
   },
-  "revision": "20210715",
+  "revision": "20210723",
   "rootUrl": "https://slides.googleapis.com/",
   "schemas": {
     "AffineTransform": {
diff --git a/googleapiclient/discovery_cache/documents/smartdevicemanagement.v1.json b/googleapiclient/discovery_cache/documents/smartdevicemanagement.v1.json
index 7327b9c..b811638 100644
--- a/googleapiclient/discovery_cache/documents/smartdevicemanagement.v1.json
+++ b/googleapiclient/discovery_cache/documents/smartdevicemanagement.v1.json
@@ -355,7 +355,7 @@
       }
     }
   },
-  "revision": "20210705",
+  "revision": "20210717",
   "rootUrl": "https://smartdevicemanagement.googleapis.com/",
   "schemas": {
     "GoogleHomeEnterpriseSdmV1Device": {
diff --git a/googleapiclient/discovery_cache/documents/speech.v1.json b/googleapiclient/discovery_cache/documents/speech.v1.json
index c81e369..de56af2 100644
--- a/googleapiclient/discovery_cache/documents/speech.v1.json
+++ b/googleapiclient/discovery_cache/documents/speech.v1.json
@@ -212,7 +212,7 @@
       }
     }
   },
-  "revision": "20210706",
+  "revision": "20210714",
   "rootUrl": "https://speech.googleapis.com/",
   "schemas": {
     "ListOperationsResponse": {
diff --git a/googleapiclient/discovery_cache/documents/speech.v1p1beta1.json b/googleapiclient/discovery_cache/documents/speech.v1p1beta1.json
index 78243a5..0424806 100644
--- a/googleapiclient/discovery_cache/documents/speech.v1p1beta1.json
+++ b/googleapiclient/discovery_cache/documents/speech.v1p1beta1.json
@@ -524,7 +524,7 @@
       }
     }
   },
-  "revision": "20210706",
+  "revision": "20210714",
   "rootUrl": "https://speech.googleapis.com/",
   "schemas": {
     "ClassItem": {
@@ -547,7 +547,7 @@
           "description": "Required. The custom class to create."
         },
         "customClassId": {
-          "description": "The ID to use for the custom class, which will become the final component of the custom class' resource name. This value should be 4-63 characters, and valid characters are /a-z-/.",
+          "description": "Required. The ID to use for the custom class, which will become the final component of the custom class' resource name. This value should be 4-63 characters, and valid characters are /a-z-/.",
           "type": "string"
         }
       },
@@ -562,7 +562,7 @@
           "description": "Required. The phrase set to create."
         },
         "phraseSetId": {
-          "description": "The ID to use for the phrase set, which will become the final component of the phrase set's resource name. This value should be 4-63 characters, and valid characters are /a-z-/.",
+          "description": "Required. The ID to use for the phrase set, which will become the final component of the phrase set's resource name. This value should be 4-63 characters, and valid characters are /a-z-/.",
           "type": "string"
         }
       },
@@ -596,6 +596,25 @@
       "properties": {},
       "type": "object"
     },
+    "Entry": {
+      "description": "A single replacement configuration.",
+      "id": "Entry",
+      "properties": {
+        "caseSensitive": {
+          "description": "Whether the search is case sensitive.",
+          "type": "boolean"
+        },
+        "replace": {
+          "description": "What to replace with. Max length is 100 characters.",
+          "type": "string"
+        },
+        "search": {
+          "description": "What to replace. Max length is 100 characters.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "ListCustomClassesResponse": {
       "description": "Message returned to the client by the `ListCustomClasses` method.",
       "id": "ListCustomClassesResponse",
@@ -931,6 +950,10 @@
           },
           "type": "array"
         },
+        "transcriptNormalization": {
+          "$ref": "TranscriptNormalization",
+          "description": "Use transcription normalization to automatically replace parts of the transcript with phrases of your choosing. For StreamingRecognize, this normalization only applies to stable partial transcripts (stability > 0.8) and final transcripts."
+        },
         "useEnhanced": {
           "description": "Set to true to use an enhanced model for speech recognition. If `use_enhanced` is set to true and the `model` field is not set, then an appropriate enhanced model is chosen if an enhanced model exists for the audio. If `use_enhanced` is true and an enhanced version of the specified model does not exist, then the speech is recognized using the standard version of the specified model.",
           "type": "boolean"
@@ -1222,6 +1245,17 @@
       },
       "type": "object"
     },
+    "TranscriptNormalization": {
+      "description": "Transcription normalization configuration. Use transcription normalization to automatically replace parts of the transcript with phrases of your choosing. For StreamingRecognize, this normalization only applies to stable partial transcripts (stability > 0.8) and final transcripts.",
+      "id": "TranscriptNormalization",
+      "properties": {
+        "entries": {
+          "$ref": "Entry",
+          "description": "A list of replacement entries. We will perform replacement with one entry at a time. For example, the second entry in [\"cat\" => \"dog\", \"mountain cat\" => \"mountain dog\"] will never be applied because we will always process the first entry before it. At most 100 entries."
+        }
+      },
+      "type": "object"
+    },
     "TranscriptOutputConfig": {
       "description": "Specifies an optional destination for the recognition results.",
       "id": "TranscriptOutputConfig",
diff --git a/googleapiclient/discovery_cache/documents/speech.v2beta1.json b/googleapiclient/discovery_cache/documents/speech.v2beta1.json
index 8f6bc9e..579a81c 100644
--- a/googleapiclient/discovery_cache/documents/speech.v2beta1.json
+++ b/googleapiclient/discovery_cache/documents/speech.v2beta1.json
@@ -184,7 +184,7 @@
       }
     }
   },
-  "revision": "20210706",
+  "revision": "20210714",
   "rootUrl": "https://speech.googleapis.com/",
   "schemas": {
     "ListOperationsResponse": {
diff --git a/googleapiclient/discovery_cache/documents/sqladmin.v1.json b/googleapiclient/discovery_cache/documents/sqladmin.v1.json
index 3efd399..98d9701 100644
--- a/googleapiclient/discovery_cache/documents/sqladmin.v1.json
+++ b/googleapiclient/discovery_cache/documents/sqladmin.v1.json
@@ -108,13 +108,808 @@
   },
   "protocol": "rest",
   "resources": {
+    "backupRuns": {
+      "methods": {
+        "delete": {
+          "description": "Deletes the backup taken by a backup run.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/backupRuns/{id}",
+          "httpMethod": "DELETE",
+          "id": "sql.backupRuns.delete",
+          "parameterOrder": [
+            "project",
+            "instance",
+            "id"
+          ],
+          "parameters": {
+            "id": {
+              "description": "The ID of the backup run to delete. To find a backup run ID, use the list method.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/backupRuns/{id}",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "get": {
+          "description": "Retrieves a resource containing information about a backup run.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/backupRuns/{id}",
+          "httpMethod": "GET",
+          "id": "sql.backupRuns.get",
+          "parameterOrder": [
+            "project",
+            "instance",
+            "id"
+          ],
+          "parameters": {
+            "id": {
+              "description": "The ID of this backup run.",
+              "format": "int64",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/backupRuns/{id}",
+          "response": {
+            "$ref": "BackupRun"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "insert": {
+          "description": "Creates a new backup run on demand.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/backupRuns",
+          "httpMethod": "POST",
+          "id": "sql.backupRuns.insert",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/backupRuns",
+          "request": {
+            "$ref": "BackupRun"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "list": {
+          "description": "Lists all backup runs associated with the project or a given instance and configuration in the reverse chronological order of the backup initiation time.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/backupRuns",
+          "httpMethod": "GET",
+          "id": "sql.backupRuns.list",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID, or \"-\" for all instances. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "maxResults": {
+              "description": "Maximum number of backup runs per response.",
+              "format": "int32",
+              "location": "query",
+              "type": "integer"
+            },
+            "pageToken": {
+              "description": "A previously-returned page token representing part of the larger set of results to view.",
+              "location": "query",
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/backupRuns",
+          "response": {
+            "$ref": "BackupRunsListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        }
+      }
+    },
+    "connect": {
+      "methods": {
+        "generateEphemeralCert": {
+          "description": "Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.",
+          "flatPath": "v1/projects/{project}/instances/{instance}:generateEphemeralCert",
+          "httpMethod": "POST",
+          "id": "sql.connect.generateEphemeral",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}:generateEphemeralCert",
+          "request": {
+            "$ref": "GenerateEphemeralCertRequest"
+          },
+          "response": {
+            "$ref": "GenerateEphemeralCertResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "get": {
+          "description": "Retrieves connect settings about a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/connectSettings",
+          "httpMethod": "GET",
+          "id": "sql.connect.get",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "readTime": {
+              "description": "Optional. Optional snapshot read timestamp to trade freshness for performance.",
+              "format": "google-datetime",
+              "location": "query",
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/connectSettings",
+          "response": {
+            "$ref": "ConnectSettings"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        }
+      }
+    },
+    "databases": {
+      "methods": {
+        "delete": {
+          "description": "Deletes a database from a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/databases/{database}",
+          "httpMethod": "DELETE",
+          "id": "sql.databases.delete",
+          "parameterOrder": [
+            "project",
+            "instance",
+            "database"
+          ],
+          "parameters": {
+            "database": {
+              "description": "Name of the database to be deleted in the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/databases/{database}",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "get": {
+          "description": "Retrieves a resource containing information about a database inside a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/databases/{database}",
+          "httpMethod": "GET",
+          "id": "sql.databases.get",
+          "parameterOrder": [
+            "project",
+            "instance",
+            "database"
+          ],
+          "parameters": {
+            "database": {
+              "description": "Name of the database in the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/databases/{database}",
+          "response": {
+            "$ref": "Database"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "insert": {
+          "description": "Inserts a resource containing information about a database inside a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/databases",
+          "httpMethod": "POST",
+          "id": "sql.databases.insert",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/databases",
+          "request": {
+            "$ref": "Database"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "list": {
+          "description": "Lists databases in the specified Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/databases",
+          "httpMethod": "GET",
+          "id": "sql.databases.list",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/databases",
+          "response": {
+            "$ref": "DatabasesListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "patch": {
+          "description": "Partially updates a resource containing information about a database inside a Cloud SQL instance. This method supports patch semantics.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/databases/{database}",
+          "httpMethod": "PATCH",
+          "id": "sql.databases.patch",
+          "parameterOrder": [
+            "project",
+            "instance",
+            "database"
+          ],
+          "parameters": {
+            "database": {
+              "description": "Name of the database to be updated in the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/databases/{database}",
+          "request": {
+            "$ref": "Database"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "update": {
+          "description": "Updates a resource containing information about a database inside a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/databases/{database}",
+          "httpMethod": "PUT",
+          "id": "sql.databases.update",
+          "parameterOrder": [
+            "project",
+            "instance",
+            "database"
+          ],
+          "parameters": {
+            "database": {
+              "description": "Name of the database to be updated in the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/databases/{database}",
+          "request": {
+            "$ref": "Database"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        }
+      }
+    },
+    "flags": {
+      "methods": {
+        "list": {
+          "description": "Lists all available database flags for Cloud SQL instances.",
+          "flatPath": "v1/flags",
+          "httpMethod": "GET",
+          "id": "sql.flags.list",
+          "parameterOrder": [],
+          "parameters": {
+            "databaseVersion": {
+              "description": "Database type and version you want to retrieve flags for. By default, this method returns flags for all database types and versions.",
+              "location": "query",
+              "type": "string"
+            }
+          },
+          "path": "v1/flags",
+          "response": {
+            "$ref": "FlagsListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        }
+      }
+    },
     "instances": {
       "methods": {
+        "addServerCa": {
+          "description": "Adds a new trusted Certificate Authority (CA) version for the specified instance. Required to prepare for a certificate rotation. If a CA version was previously added but never used in a certificate rotation, this operation replaces that version. There cannot be more than one CA version waiting to be rotated in.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/addServerCa",
+          "httpMethod": "POST",
+          "id": "sql.instances.addServerCa",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/addServerCa",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "clone": {
+          "description": "Creates a Cloud SQL instance as a clone of the source instance. Using this operation might cause your instance to restart.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/clone",
+          "httpMethod": "POST",
+          "id": "sql.instances.clone",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "The ID of the Cloud SQL instance to be cloned (source). This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the source as well as the clone Cloud SQL instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/clone",
+          "request": {
+            "$ref": "InstancesCloneRequest"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "delete": {
+          "description": "Deletes a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}",
+          "httpMethod": "DELETE",
+          "id": "sql.instances.delete",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance to be deleted.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "demoteMaster": {
+          "description": "Demotes the stand-alone instance to be a Cloud SQL read replica for an external database server.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/demoteMaster",
+          "httpMethod": "POST",
+          "id": "sql.instances.demoteMaster",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance name.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/demoteMaster",
+          "request": {
+            "$ref": "InstancesDemoteMasterRequest"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "export": {
+          "description": "Exports data from a Cloud SQL instance to a Cloud Storage bucket as a SQL dump or CSV file.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/export",
+          "httpMethod": "POST",
+          "id": "sql.instances.export",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance to be exported.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/export",
+          "request": {
+            "$ref": "InstancesExportRequest"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ]
+        },
+        "failover": {
+          "description": "Initiates a manual failover of a high availability (HA) primary instance to a standby instance, which becomes the primary instance. Users are then rerouted to the new primary. For more information, see the Overview of high availability page in the Cloud SQL documentation. If using Legacy HA (MySQL only), this causes the instance to failover to its failover replica instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/failover",
+          "httpMethod": "POST",
+          "id": "sql.instances.failover",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "ID of the project that contains the read replica.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/failover",
+          "request": {
+            "$ref": "InstancesFailoverRequest"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "get": {
+          "description": "Retrieves a resource containing information about a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}",
+          "httpMethod": "GET",
+          "id": "sql.instances.get",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}",
+          "response": {
+            "$ref": "DatabaseInstance"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "import": {
+          "description": "Imports data into a Cloud SQL instance from a SQL dump or CSV file in Cloud Storage.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/import",
+          "httpMethod": "POST",
+          "id": "sql.instances.import",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/import",
+          "request": {
+            "$ref": "InstancesImportRequest"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ]
+        },
+        "insert": {
+          "description": "Creates a new Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances",
+          "httpMethod": "POST",
+          "id": "sql.instances.insert",
+          "parameterOrder": [
+            "project"
+          ],
+          "parameters": {
+            "project": {
+              "description": "Project ID of the project to which the newly created Cloud SQL instances should belong.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances",
+          "request": {
+            "$ref": "DatabaseInstance"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
         "list": {
           "description": "Lists instances under a given project.",
           "flatPath": "v1/projects/{project}/instances",
           "httpMethod": "GET",
-          "id": "sqladmin.instances.list",
+          "id": "sql.instances.list",
           "parameterOrder": [
             "project"
           ],
@@ -150,6 +945,450 @@
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/sqlservice.admin"
           ]
+        },
+        "listServerCas": {
+          "description": "Lists all of the trusted Certificate Authorities (CAs) for the specified instance. There can be up to three CAs listed: the CA that was used to sign the certificate that is currently in use, a CA that has been added but not yet used to sign a certificate, and a CA used to sign a certificate that has previously rotated out.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/listServerCas",
+          "httpMethod": "GET",
+          "id": "sql.instances.listServerCas",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/listServerCas",
+          "response": {
+            "$ref": "InstancesListServerCasResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "patch": {
+          "description": "Updates settings of a Cloud SQL instance. This method supports patch semantics.",
+          "flatPath": "v1/projects/{project}/instances/{instance}",
+          "httpMethod": "PATCH",
+          "id": "sql.instances.patch",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}",
+          "request": {
+            "$ref": "DatabaseInstance"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "promoteReplica": {
+          "description": "Promotes the read replica instance to be a stand-alone Cloud SQL instance. Using this operation might cause your instance to restart.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/promoteReplica",
+          "httpMethod": "POST",
+          "id": "sql.instances.promoteReplica",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL read replica instance name.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "ID of the project that contains the read replica.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/promoteReplica",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "resetSslConfig": {
+          "description": "Deletes all client certificates and generates a new server SSL certificate for the instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/resetSslConfig",
+          "httpMethod": "POST",
+          "id": "sql.instances.resetSslConfig",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/resetSslConfig",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "restart": {
+          "description": "Restarts a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/restart",
+          "httpMethod": "POST",
+          "id": "sql.instances.restart",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance to be restarted.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/restart",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "restoreBackup": {
+          "description": "Restores a backup of a Cloud SQL instance. Using this operation might cause your instance to restart.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/restoreBackup",
+          "httpMethod": "POST",
+          "id": "sql.instances.restoreBackup",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/restoreBackup",
+          "request": {
+            "$ref": "InstancesRestoreBackupRequest"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "rotateServerCa": {
+          "description": "Rotates the server certificate to one signed by the Certificate Authority (CA) version previously added with the addServerCA method.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/rotateServerCa",
+          "httpMethod": "POST",
+          "id": "sql.instances.rotateServerCa",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/rotateServerCa",
+          "request": {
+            "$ref": "InstancesRotateServerCaRequest"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "startReplica": {
+          "description": "Starts the replication in the read replica instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/startReplica",
+          "httpMethod": "POST",
+          "id": "sql.instances.startReplica",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL read replica instance name.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "ID of the project that contains the read replica.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/startReplica",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "stopReplica": {
+          "description": "Stops the replication in the read replica instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/stopReplica",
+          "httpMethod": "POST",
+          "id": "sql.instances.stopReplica",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL read replica instance name.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "ID of the project that contains the read replica.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/stopReplica",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "truncateLog": {
+          "description": "Truncate MySQL general and slow query log tables MySQL only.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/truncateLog",
+          "httpMethod": "POST",
+          "id": "sql.instances.truncateLog",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the Cloud SQL project.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/truncateLog",
+          "request": {
+            "$ref": "InstancesTruncateLogRequest"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "update": {
+          "description": "Updates settings of a Cloud SQL instance. Using this operation might cause your instance to restart.",
+          "flatPath": "v1/projects/{project}/instances/{instance}",
+          "httpMethod": "PUT",
+          "id": "sql.instances.update",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}",
+          "request": {
+            "$ref": "DatabaseInstance"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        }
+      }
+    },
+    "operations": {
+      "methods": {
+        "get": {
+          "description": "Retrieves an instance operation that has been performed on an instance.",
+          "flatPath": "v1/projects/{project}/operations/{operation}",
+          "httpMethod": "GET",
+          "id": "sql.operations.get",
+          "parameterOrder": [
+            "project",
+            "operation"
+          ],
+          "parameters": {
+            "operation": {
+              "description": "Instance operation ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/operations/{operation}",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "list": {
+          "description": "Lists all instance operations that have been performed on the given Cloud SQL instance in the reverse chronological order of the start time.",
+          "flatPath": "v1/projects/{project}/operations",
+          "httpMethod": "GET",
+          "id": "sql.operations.list",
+          "parameterOrder": [
+            "project"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "query",
+              "type": "string"
+            },
+            "maxResults": {
+              "description": "Maximum number of operations per response.",
+              "format": "uint32",
+              "location": "query",
+              "type": "integer"
+            },
+            "pageToken": {
+              "description": "A previously-returned page token representing part of the larger set of results to view.",
+              "location": "query",
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/operations",
+          "response": {
+            "$ref": "OperationsListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
         }
       }
     },
@@ -157,11 +1396,11 @@
       "resources": {
         "instances": {
           "methods": {
-            "generateEphemeralCert": {
-              "description": "Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.",
-              "flatPath": "v1/projects/{project}/instances/{instance}:generateEphemeralCert",
+            "rescheduleMaintenance": {
+              "description": "Reschedules the maintenance on the given instance.",
+              "flatPath": "v1/projects/{project}/instances/{instance}/rescheduleMaintenance",
               "httpMethod": "POST",
-              "id": "sqladmin.projects.instances.generateEphemeralCert",
+              "id": "sql.projects.instances.rescheduleMaintenance",
               "parameterOrder": [
                 "project",
                 "instance"
@@ -174,61 +1413,29 @@
                   "type": "string"
                 },
                 "project": {
-                  "description": "Project ID of the project that contains the instance.",
+                  "description": "ID of the project that contains the instance.",
                   "location": "path",
                   "required": true,
                   "type": "string"
                 }
               },
-              "path": "v1/projects/{project}/instances/{instance}:generateEphemeralCert",
+              "path": "v1/projects/{project}/instances/{instance}/rescheduleMaintenance",
               "request": {
-                "$ref": "GenerateEphemeralCertRequest"
+                "$ref": "SqlInstancesRescheduleMaintenanceRequestBody"
               },
               "response": {
-                "$ref": "GenerateEphemeralCertResponse"
+                "$ref": "Operation"
               },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/sqlservice.admin"
               ]
             },
-            "get": {
-              "description": "Retrieves a resource containing information about a Cloud SQL instance.",
-              "flatPath": "v1/projects/{project}/instances/{instance}",
-              "httpMethod": "GET",
-              "id": "sqladmin.projects.instances.get",
-              "parameterOrder": [
-                "project",
-                "instance"
-              ],
-              "parameters": {
-                "instance": {
-                  "description": "Database instance ID. This does not include the project ID.",
-                  "location": "path",
-                  "required": true,
-                  "type": "string"
-                },
-                "project": {
-                  "description": "Project ID of the project that contains the instance.",
-                  "location": "path",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "path": "v1/projects/{project}/instances/{instance}",
-              "response": {
-                "$ref": "DatabaseInstance"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/sqlservice.admin"
-              ]
-            },
-            "getConnectSettings": {
-              "description": "Retrieves connect settings about a Cloud SQL instance.",
-              "flatPath": "v1/projects/{project}/instances/{instance}/connectSettings",
-              "httpMethod": "GET",
-              "id": "sqladmin.projects.instances.getConnectSettings",
+            "startExternalSync": {
+              "description": "Start External primary instance migration.",
+              "flatPath": "v1/projects/{project}/instances/{instance}/startExternalSync",
+              "httpMethod": "POST",
+              "id": "sql.projects.instances.startExternalSync",
               "parameterOrder": [
                 "project",
                 "instance"
@@ -241,74 +1448,531 @@
                   "type": "string"
                 },
                 "project": {
-                  "description": "Project ID of the project that contains the instance.",
+                  "description": "ID of the project that contains the instance.",
                   "location": "path",
                   "required": true,
                   "type": "string"
                 },
-                "readTime": {
-                  "description": "Optional. Optional snapshot read timestamp to trade freshness for performance.",
-                  "format": "google-datetime",
+                "skipVerification": {
+                  "description": "Whether to skip the verification step (VESS).",
+                  "location": "query",
+                  "type": "boolean"
+                },
+                "syncMode": {
+                  "description": "External sync mode.",
+                  "enum": [
+                    "EXTERNAL_SYNC_MODE_UNSPECIFIED",
+                    "ONLINE",
+                    "OFFLINE"
+                  ],
+                  "enumDescriptions": [
+                    "Unknown external sync mode, will be defaulted to ONLINE mode",
+                    "Online external sync will set up replication after initial data external sync",
+                    "Offline external sync only dumps and loads a one-time snapshot of the primary instance's data"
+                  ],
                   "location": "query",
                   "type": "string"
                 }
               },
-              "path": "v1/projects/{project}/instances/{instance}/connectSettings",
+              "path": "v1/projects/{project}/instances/{instance}/startExternalSync",
               "response": {
-                "$ref": "ConnectSettings"
+                "$ref": "Operation"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/sqlservice.admin"
+              ]
+            },
+            "verifyExternalSyncSettings": {
+              "description": "Verify External primary instance external sync settings.",
+              "flatPath": "v1/projects/{project}/instances/{instance}/verifyExternalSyncSettings",
+              "httpMethod": "POST",
+              "id": "sql.projects.instances.verifyExternalSyncSettings",
+              "parameterOrder": [
+                "project",
+                "instance"
+              ],
+              "parameters": {
+                "instance": {
+                  "description": "Cloud SQL instance ID. This does not include the project ID.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "project": {
+                  "description": "Project ID of the project that contains the instance.",
+                  "location": "path",
+                  "required": true,
+                  "type": "string"
+                },
+                "syncMode": {
+                  "description": "External sync mode",
+                  "enum": [
+                    "EXTERNAL_SYNC_MODE_UNSPECIFIED",
+                    "ONLINE",
+                    "OFFLINE"
+                  ],
+                  "enumDescriptions": [
+                    "Unknown external sync mode, will be defaulted to ONLINE mode",
+                    "Online external sync will set up replication after initial data external sync",
+                    "Offline external sync only dumps and loads a one-time snapshot of the primary instance's data"
+                  ],
+                  "location": "query",
+                  "type": "string"
+                },
+                "verifyConnectionOnly": {
+                  "description": "Flag to enable verifying connection only",
+                  "location": "query",
+                  "type": "boolean"
+                }
+              },
+              "path": "v1/projects/{project}/instances/{instance}/verifyExternalSyncSettings",
+              "response": {
+                "$ref": "SqlInstancesVerifyExternalSyncSettingsResponse"
               },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/sqlservice.admin"
               ]
             }
-          },
-          "resources": {
-            "createEphemeral": {
-              "methods": {
-                "create": {
-                  "description": "Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.",
-                  "flatPath": "v1/projects/{project}/instances/{instance}/createEphemeral",
-                  "httpMethod": "POST",
-                  "id": "sqladmin.projects.instances.createEphemeral.create",
-                  "parameterOrder": [
-                    "project",
-                    "instance"
-                  ],
-                  "parameters": {
-                    "instance": {
-                      "description": "Cloud SQL instance ID. This does not include the project ID.",
-                      "location": "path",
-                      "required": true,
-                      "type": "string"
-                    },
-                    "project": {
-                      "description": "Project ID of the Cloud SQL project.",
-                      "location": "path",
-                      "required": true,
-                      "type": "string"
-                    }
-                  },
-                  "path": "v1/projects/{project}/instances/{instance}/createEphemeral",
-                  "request": {
-                    "$ref": "SslCertsCreateEphemeralRequest"
-                  },
-                  "response": {
-                    "$ref": "SslCert"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/sqlservice.admin"
-                  ]
-                }
-              }
-            }
           }
         }
       }
+    },
+    "sslCerts": {
+      "methods": {
+        "createEphemeral": {
+          "description": "Generates a short-lived X509 certificate containing the provided public key and signed by a private key specific to the target instance. Users may use the certificate to authenticate as themselves when connecting to the database.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/createEphemeral",
+          "httpMethod": "POST",
+          "id": "sql.sslCerts.createEphemeral",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the Cloud SQL project.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/createEphemeral",
+          "request": {
+            "$ref": "SslCertsCreateEphemeralRequest"
+          },
+          "response": {
+            "$ref": "SslCert"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "delete": {
+          "description": "Deletes the SSL certificate. For First Generation instances, the certificate remains valid until the instance is restarted.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}",
+          "httpMethod": "DELETE",
+          "id": "sql.sslCerts.delete",
+          "parameterOrder": [
+            "project",
+            "instance",
+            "sha1Fingerprint"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "sha1Fingerprint": {
+              "description": "Sha1 FingerPrint.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "get": {
+          "description": "Retrieves a particular SSL certificate. Does not include the private key (required for usage). The private key must be saved from the response to initial creation.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}",
+          "httpMethod": "GET",
+          "id": "sql.sslCerts.get",
+          "parameterOrder": [
+            "project",
+            "instance",
+            "sha1Fingerprint"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "sha1Fingerprint": {
+              "description": "Sha1 FingerPrint.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}",
+          "response": {
+            "$ref": "SslCert"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "insert": {
+          "description": "Creates an SSL certificate and returns it along with the private key and server certificate authority. The new certificate will not be usable until the instance is restarted.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/sslCerts",
+          "httpMethod": "POST",
+          "id": "sql.sslCerts.insert",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/sslCerts",
+          "request": {
+            "$ref": "SslCertsInsertRequest"
+          },
+          "response": {
+            "$ref": "SslCertsInsertResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "list": {
+          "description": "Lists all of the current SSL certificates for the instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/sslCerts",
+          "httpMethod": "GET",
+          "id": "sql.sslCerts.list",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Cloud SQL instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/sslCerts",
+          "response": {
+            "$ref": "SslCertsListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        }
+      }
+    },
+    "tiers": {
+      "methods": {
+        "list": {
+          "description": "Lists all available machine types (tiers) for Cloud SQL, for example, db-custom-1-3840. For more information, see https://cloud.google.com/sql/pricing.",
+          "flatPath": "v1/projects/{project}/tiers",
+          "httpMethod": "GET",
+          "id": "sql.tiers.list",
+          "parameterOrder": [
+            "project"
+          ],
+          "parameters": {
+            "project": {
+              "description": "Project ID of the project for which to list tiers.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/tiers",
+          "response": {
+            "$ref": "TiersListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        }
+      }
+    },
+    "users": {
+      "methods": {
+        "delete": {
+          "description": "Deletes a user from a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/users",
+          "httpMethod": "DELETE",
+          "id": "sql.users.delete",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "host": {
+              "description": "Host of the user in the instance.",
+              "location": "query",
+              "type": "string"
+            },
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "name": {
+              "description": "Name of the user in the instance.",
+              "location": "query",
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/users",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "insert": {
+          "description": "Creates a new user in a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/users",
+          "httpMethod": "POST",
+          "id": "sql.users.insert",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/users",
+          "request": {
+            "$ref": "User"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "list": {
+          "description": "Lists users in the specified Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/users",
+          "httpMethod": "GET",
+          "id": "sql.users.list",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "body.etag": {
+              "description": "This field is deprecated and will be removed from a future version of the API.",
+              "location": "query",
+              "type": "string"
+            },
+            "body.host": {
+              "description": "The host name from which the user can connect. For *insert* operations, host defaults to an empty string. For *update* operations, host is specified as part of the request URL. The host name cannot be updated after insertion.",
+              "location": "query",
+              "type": "string"
+            },
+            "body.instance": {
+              "description": "The name of the Cloud SQL instance. This does not include the project ID. Can be omitted for *update* since it is already specified on the URL.",
+              "location": "query",
+              "type": "string"
+            },
+            "body.kind": {
+              "description": "This is always *sql#user*.",
+              "location": "query",
+              "type": "string"
+            },
+            "body.name": {
+              "description": "The name of the user in the Cloud SQL instance. Can be omitted for *update* since it is already specified in the URL.",
+              "location": "query",
+              "type": "string"
+            },
+            "body.password": {
+              "description": "The password for the user.",
+              "location": "query",
+              "type": "string"
+            },
+            "body.project": {
+              "description": "The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable. Can be omitted for *update* since it is already specified on the URL.",
+              "location": "query",
+              "type": "string"
+            },
+            "body.sqlserverUserDetails.disabled": {
+              "description": "If the user has been disabled",
+              "location": "query",
+              "type": "boolean"
+            },
+            "body.sqlserverUserDetails.serverRoles": {
+              "description": "The server roles for this user",
+              "location": "query",
+              "repeated": true,
+              "type": "string"
+            },
+            "body.type": {
+              "description": "The user type. It determines the method to authenticate the user during login. The default is the database's built-in user type.",
+              "enum": [
+                "BUILT_IN",
+                "CLOUD_IAM_USER",
+                "CLOUD_IAM_SERVICE_ACCOUNT"
+              ],
+              "enumDescriptions": [
+                "The database's built-in user type.",
+                "Cloud IAM user.",
+                "Cloud IAM service account."
+              ],
+              "location": "query",
+              "type": "string"
+            },
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/users",
+          "response": {
+            "$ref": "UsersListResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        },
+        "update": {
+          "description": "Updates an existing user in a Cloud SQL instance.",
+          "flatPath": "v1/projects/{project}/instances/{instance}/users",
+          "httpMethod": "PUT",
+          "id": "sql.users.update",
+          "parameterOrder": [
+            "project",
+            "instance"
+          ],
+          "parameters": {
+            "host": {
+              "description": "Optional. Host of the user in the instance.",
+              "location": "query",
+              "type": "string"
+            },
+            "instance": {
+              "description": "Database instance ID. This does not include the project ID.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            },
+            "name": {
+              "description": "Name of the user in the instance.",
+              "location": "query",
+              "type": "string"
+            },
+            "project": {
+              "description": "Project ID of the project that contains the instance.",
+              "location": "path",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "path": "v1/projects/{project}/instances/{instance}/users",
+          "request": {
+            "$ref": "User"
+          },
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/sqlservice.admin"
+          ]
+        }
+      }
     }
   },
-  "revision": "20210627",
+  "revision": "20210715",
   "rootUrl": "https://sqladmin.googleapis.com/",
   "schemas": {
     "AclEntry": {
@@ -406,6 +2070,22 @@
       },
       "type": "object"
     },
+    "BackupContext": {
+      "description": "Backup context.",
+      "id": "BackupContext",
+      "properties": {
+        "backupId": {
+          "description": "The identifier of the backup.",
+          "format": "int64",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always **sql#backupContext**.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "BackupRetentionSettings": {
       "description": "We currently only support backup retention by specifying the number of backups we will retain.",
       "id": "BackupRetentionSettings",
@@ -430,6 +2110,197 @@
       },
       "type": "object"
     },
+    "BackupRun": {
+      "description": "A BackupRun resource.",
+      "id": "BackupRun",
+      "properties": {
+        "backupKind": {
+          "description": "Specifies the kind of backup, PHYSICAL or DEFAULT_SNAPSHOT.",
+          "enum": [
+            "SQL_BACKUP_KIND_UNSPECIFIED",
+            "SNAPSHOT",
+            "PHYSICAL"
+          ],
+          "enumDescriptions": [
+            "This is an unknown BackupKind.",
+            "The snapshot based backups",
+            "Physical backups"
+          ],
+          "type": "string"
+        },
+        "description": {
+          "description": "The description of this run, only applicable to on-demand backups.",
+          "type": "string"
+        },
+        "diskEncryptionConfiguration": {
+          "$ref": "DiskEncryptionConfiguration",
+          "description": "Encryption configuration specific to a backup."
+        },
+        "diskEncryptionStatus": {
+          "$ref": "DiskEncryptionStatus",
+          "description": "Encryption status specific to a backup."
+        },
+        "endTime": {
+          "description": "The time the backup operation completed in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "enqueuedTime": {
+          "description": "The time the run was enqueued in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "error": {
+          "$ref": "OperationError",
+          "description": "Information about why the backup operation failed. This is only present if the run has the FAILED status."
+        },
+        "id": {
+          "description": "The identifier for this backup run. Unique only for a specific Cloud SQL instance.",
+          "format": "int64",
+          "type": "string"
+        },
+        "instance": {
+          "description": "Name of the database instance.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always *sql#backupRun*.",
+          "type": "string"
+        },
+        "location": {
+          "description": "Location of the backups.",
+          "type": "string"
+        },
+        "selfLink": {
+          "description": "The URI of this resource.",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "The time the backup operation actually started in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "status": {
+          "description": "The status of this run.",
+          "enum": [
+            "SQL_BACKUP_RUN_STATUS_UNSPECIFIED",
+            "ENQUEUED",
+            "OVERDUE",
+            "RUNNING",
+            "FAILED",
+            "SUCCESSFUL",
+            "SKIPPED",
+            "DELETION_PENDING",
+            "DELETION_FAILED",
+            "DELETED"
+          ],
+          "enumDescriptions": [
+            "The status of the run is unknown.",
+            "The backup operation was enqueued.",
+            "The backup is overdue across a given backup window. Indicates a problem. Example: Long-running operation in progress during the whole window.",
+            "The backup is in progress.",
+            "The backup failed.",
+            "The backup was successful.",
+            "The backup was skipped (without problems) for a given backup window. Example: Instance was idle.",
+            "The backup is about to be deleted.",
+            "The backup deletion failed.",
+            "The backup has been deleted."
+          ],
+          "type": "string"
+        },
+        "type": {
+          "description": "The type of this run; can be either \"AUTOMATED\" or \"ON_DEMAND\". This field defaults to \"ON_DEMAND\" and is ignored, when specified for insert requests.",
+          "enum": [
+            "SQL_BACKUP_RUN_TYPE_UNSPECIFIED",
+            "AUTOMATED",
+            "ON_DEMAND"
+          ],
+          "enumDescriptions": [
+            "This is an unknown BackupRun type.",
+            "The backup schedule automatically triggers a backup.",
+            "The user manually triggers a backup."
+          ],
+          "type": "string"
+        },
+        "windowStartTime": {
+          "description": "The start time of the backup window during which this the backup was attempted in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "BackupRunsListResponse": {
+      "description": "Backup run list results.",
+      "id": "BackupRunsListResponse",
+      "properties": {
+        "items": {
+          "description": "A list of backup runs in reverse chronological order of the enqueued time.",
+          "items": {
+            "$ref": "BackupRun"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always *sql#backupRunsList*.",
+          "type": "string"
+        },
+        "nextPageToken": {
+          "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "BinLogCoordinates": {
+      "description": "Binary log coordinates.",
+      "id": "BinLogCoordinates",
+      "properties": {
+        "binLogFileName": {
+          "description": "Name of the binary log file for a Cloud SQL instance.",
+          "type": "string"
+        },
+        "binLogPosition": {
+          "description": "Position (offset) within the binary log file.",
+          "format": "int64",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always *sql#binLogCoordinates*.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "CloneContext": {
+      "description": "Database instance clone context.",
+      "id": "CloneContext",
+      "properties": {
+        "binLogCoordinates": {
+          "$ref": "BinLogCoordinates",
+          "description": "Binary log coordinates, if specified, identify the position up to which the source instance is cloned. If not specified, the source instance is cloned up to the most recent binary log coordinates."
+        },
+        "destinationInstanceName": {
+          "description": "Name of the Cloud SQL instance to be created as a clone.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always *sql#cloneContext*.",
+          "type": "string"
+        },
+        "pitrTimestampMs": {
+          "description": "Reserved for future use.",
+          "format": "int64",
+          "type": "string"
+        },
+        "pointInTime": {
+          "description": "Timestamp, if specified, identifies the time to which the source instance is cloned.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "ConnectSettings": {
       "description": "Connect settings retrieval response.",
       "id": "ConnectSettings",
@@ -512,12 +2383,54 @@
       },
       "type": "object"
     },
+    "Database": {
+      "description": "Represents a SQL database on the Cloud SQL instance.",
+      "id": "Database",
+      "properties": {
+        "charset": {
+          "description": "The Cloud SQL charset value.",
+          "type": "string"
+        },
+        "collation": {
+          "description": "The Cloud SQL collation value.",
+          "type": "string"
+        },
+        "etag": {
+          "description": "This field is deprecated and will be removed from a future version of the API.",
+          "type": "string"
+        },
+        "instance": {
+          "description": "The name of the Cloud SQL instance. This does not include the project ID.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always **sql#database**.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the database in the Cloud SQL instance. This does not include the project ID or instance name.",
+          "type": "string"
+        },
+        "project": {
+          "description": "The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable.",
+          "type": "string"
+        },
+        "selfLink": {
+          "description": "The URI of this resource.",
+          "type": "string"
+        },
+        "sqlserverDatabaseDetails": {
+          "$ref": "SqlServerDatabaseDetails"
+        }
+      },
+      "type": "object"
+    },
     "DatabaseFlags": {
       "description": "Database flags for Cloud SQL instances.",
       "id": "DatabaseFlags",
       "properties": {
         "name": {
-          "description": "The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](/sql/docs/mysql/flags) in the Cloud SQL documentation.",
+          "description": "The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see [Configuring Database Flags](https://cloud.google.com/sql/docs/mysql/flags) in the Cloud SQL documentation.",
           "type": "string"
         },
         "value": {
@@ -557,7 +2470,7 @@
           "type": "string"
         },
         "databaseVersion": {
-          "description": "The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.",
+          "description": "The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.",
           "enum": [
             "SQL_DATABASE_VERSION_UNSPECIFIED",
             "MYSQL_5_1",
@@ -602,34 +2515,25 @@
         },
         "diskEncryptionConfiguration": {
           "$ref": "DiskEncryptionConfiguration",
-          "description": "Disk encryption configuration specific to an instance. Applies only to Second Generation instances."
+          "description": "Disk encryption configuration specific to an instance."
         },
         "diskEncryptionStatus": {
           "$ref": "DiskEncryptionStatus",
-          "description": "Disk encryption status specific to an instance. Applies only to Second Generation instances."
-        },
-        "encryptedRootPassword": {
-          "description": "For internal usage only. The encrypted password.",
-          "format": "byte",
-          "type": "string"
+          "description": "Disk encryption status specific to an instance."
         },
         "etag": {
           "description": "This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.",
           "type": "string"
         },
         "failoverReplica": {
-          "description": "The name and status of the failover replica. This property is applicable only to Second Generation instances.",
+          "description": "The name and status of the failover replica.",
           "properties": {
             "available": {
               "description": "The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.",
               "type": "boolean"
             },
-            "failoverInstance": {
-              "$ref": "InstanceReference",
-              "description": "A reference to the failover replica. If specified at instance creation, a failover replica is created for the instance. Currently, the failover replica can only be created in the same region as the primary instance."
-            },
             "name": {
-              "description": "The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn't include the project ID. This property is applicable only to Second Generation instances.",
+              "description": "The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn't include the project ID.",
               "type": "string"
             }
           },
@@ -639,50 +2543,6 @@
           "description": "The Compute Engine zone that the instance is currently serving from. This value could be different from the zone that was specified when the instance was created if the instance has failed over to its secondary zone.",
           "type": "string"
         },
-        "installedVersion": {
-          "description": "installed_version stores the current fully resolved database version including minor version such as MySQL_5.6.50",
-          "enum": [
-            "SQL_DATABASE_VERSION_UNSPECIFIED",
-            "MYSQL_5_1",
-            "MYSQL_5_5",
-            "MYSQL_5_6",
-            "MYSQL_5_7",
-            "POSTGRES_9_6",
-            "POSTGRES_11",
-            "SQLSERVER_2017_STANDARD",
-            "SQLSERVER_2017_ENTERPRISE",
-            "SQLSERVER_2017_EXPRESS",
-            "SQLSERVER_2017_WEB",
-            "POSTGRES_10",
-            "POSTGRES_12",
-            "POSTGRES_13",
-            "SQLSERVER_2019_STANDARD",
-            "SQLSERVER_2019_ENTERPRISE",
-            "SQLSERVER_2019_EXPRESS",
-            "SQLSERVER_2019_WEB"
-          ],
-          "enumDescriptions": [
-            "This is an unknown database version.",
-            "The database version is MySQL 5.1.",
-            "The database version is MySQL 5.5.",
-            "The database version is MySQL 5.6.",
-            "The database version is MySQL 5.7.",
-            "The database version is PostgreSQL 9.6.",
-            "The database version is PostgreSQL 11.",
-            "The database version is SQL Server 2017 Standard.",
-            "The database version is SQL Server 2017 Enterprise.",
-            "The database version is SQL Server 2017 Express.",
-            "The database version is SQL Server 2017 Web.",
-            "The database version is PostgreSQL 10.",
-            "The database version is PostgreSQL 12.",
-            "The database version is PostgreSQL 13.",
-            "The database version is SQL Server 2019 Standard.",
-            "The database version is SQL Server 2019 Enterprise.",
-            "The database version is SQL Server 2019 Express.",
-            "The database version is SQL Server 2019 Web."
-          ],
-          "type": "string"
-        },
         "instanceType": {
           "description": "The instance type. This can be one of the following. *CLOUD_SQL_INSTANCE*: A Cloud SQL instance that is not replicating from a primary instance. *ON_PREMISES_INSTANCE*: An instance running on the customer's premises. *READ_REPLICA_INSTANCE*: A Cloud SQL instance configured as a read-replica.",
           "enum": [
@@ -699,10 +2559,6 @@
           ],
           "type": "string"
         },
-        "instanceUid": {
-          "description": "Uid of the Cloud SQL instance. Used by Pantheon to check instance is created",
-          "type": "string"
-        },
         "ipAddresses": {
           "description": "The assigned IP addresses for the instance.",
           "items": {
@@ -718,10 +2574,6 @@
           "description": "This is always *sql#instance*.",
           "type": "string"
         },
-        "masterInstance": {
-          "$ref": "InstanceReference",
-          "description": "The reference to the instance which will act as primary in the replication setup."
-        },
         "masterInstanceName": {
           "description": "The name of the instance which will act as primary in the replication setup.",
           "type": "string"
@@ -755,13 +2607,6 @@
           "$ref": "ReplicaConfiguration",
           "description": "Configuration specific to failover replicas and read replicas."
         },
-        "replicaInstances": {
-          "description": "The replicas of the instance.",
-          "items": {
-            "$ref": "InstanceReference"
-          },
-          "type": "array"
-        },
         "replicaNames": {
           "description": "The replicas of the instance.",
           "items": {
@@ -847,6 +2692,93 @@
       },
       "type": "object"
     },
+    "DatabasesListResponse": {
+      "description": "Database list response.",
+      "id": "DatabasesListResponse",
+      "properties": {
+        "items": {
+          "description": "List of database resources in the instance.",
+          "items": {
+            "$ref": "Database"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always *sql#databasesList*.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "DemoteMasterConfiguration": {
+      "description": "Read-replica configuration for connecting to the on-premises primary instance.",
+      "id": "DemoteMasterConfiguration",
+      "properties": {
+        "kind": {
+          "description": "This is always **sql#demoteMasterConfiguration**.",
+          "type": "string"
+        },
+        "mysqlReplicaConfiguration": {
+          "$ref": "DemoteMasterMySqlReplicaConfiguration",
+          "description": "MySQL specific configuration when replicating from a MySQL on-premises primary instance. Replication configuration information such as the username, password, certificates, and keys are not stored in the instance metadata. The configuration information is used only to set up the replication connection and is stored by MySQL in a file named **master.info** in the data directory."
+        }
+      },
+      "type": "object"
+    },
+    "DemoteMasterContext": {
+      "description": "Database instance demote primary instance context.",
+      "id": "DemoteMasterContext",
+      "properties": {
+        "kind": {
+          "description": "This is always *sql#demoteMasterContext*.",
+          "type": "string"
+        },
+        "masterInstanceName": {
+          "description": "The name of the instance which will act as on-premises primary instance in the replication setup.",
+          "type": "string"
+        },
+        "replicaConfiguration": {
+          "$ref": "DemoteMasterConfiguration",
+          "description": "Configuration specific to read-replicas replicating from the on-premises primary instance."
+        },
+        "verifyGtidConsistency": {
+          "description": "Verify GTID consistency for demote operation. Default value: *True*. Setting this flag to false enables you to bypass GTID consistency check between on-premises primary instance and Cloud SQL instance during the demotion operation but also exposes you to the risk of future replication failures. Change the value value only if you know the reason for the GTID divergence and are confident that doing so will not cause any replication issues.",
+          "type": "boolean"
+        }
+      },
+      "type": "object"
+    },
+    "DemoteMasterMySqlReplicaConfiguration": {
+      "description": "Read-replica configuration specific to MySQL databases.",
+      "id": "DemoteMasterMySqlReplicaConfiguration",
+      "properties": {
+        "caCertificate": {
+          "description": "PEM representation of the trusted CA's x509 certificate.",
+          "type": "string"
+        },
+        "clientCertificate": {
+          "description": "PEM representation of the replica's x509 certificate.",
+          "type": "string"
+        },
+        "clientKey": {
+          "description": "PEM representation of the replica's private key. The corresponsing public key is encoded in the client's certificate. The format of the replica's private key can be either PKCS #1 or PKCS #8.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always **sql#demoteMasterMysqlReplicaConfiguration**.",
+          "type": "string"
+        },
+        "password": {
+          "description": "The password for the replication connection.",
+          "type": "string"
+        },
+        "username": {
+          "description": "The username for the replication connection.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "DenyMaintenancePeriod": {
       "description": "Deny maintenance Periods. This specifies a date range during when all CSA rollout will be denied.",
       "id": "DenyMaintenancePeriod",
@@ -896,6 +2828,239 @@
       },
       "type": "object"
     },
+    "ExportContext": {
+      "description": "Database instance export context.",
+      "id": "ExportContext",
+      "properties": {
+        "csvExportOptions": {
+          "description": "Options for exporting data as CSV. **MySQL** and **PostgreSQL** instances only.",
+          "properties": {
+            "selectQuery": {
+              "description": "The select query used to extract the data.",
+              "type": "string"
+            }
+          },
+          "type": "object"
+        },
+        "databases": {
+          "description": "Databases to be exported. **MySQL instances:** If **fileType** is **SQL** and no database is specified, all databases are exported, except for the **mysql** system database. If **fileType** is **CSV**, you can specify one database, either by using this property or by using the **csvExportOptions.selectQuery** property, which takes precedence over this property. **PostgreSQL instances:** You must specify one database to be exported. If **fileType** is **CSV**, this database must match the one specified in the **csvExportOptions.selectQuery** property. **SQL Server instances:** You must specify one database to be exported, and the **fileType** must be **BAK**.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "fileType": {
+          "description": "The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data. **BAK**: The file contains backup data for a SQL Server instance.",
+          "enum": [
+            "SQL_FILE_TYPE_UNSPECIFIED",
+            "SQL",
+            "CSV",
+            "BAK"
+          ],
+          "enumDescriptions": [
+            "Unknown file type.",
+            "File containing SQL statements.",
+            "File in CSV format.",
+            ""
+          ],
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always **sql#exportContext**.",
+          "type": "string"
+        },
+        "offload": {
+          "description": "Option for export offload.",
+          "type": "boolean"
+        },
+        "sqlExportOptions": {
+          "description": "Options for exporting data as SQL statements.",
+          "properties": {
+            "mysqlExportOptions": {
+              "description": "Options for exporting from MySQL.",
+              "properties": {
+                "masterData": {
+                  "description": "Option to include SQL statement required to set up replication. If set to **1**, the dump file includes a CHANGE MASTER TO statement with the binary log coordinates, and --set-gtid-purged is set to ON. If set to **2**, the CHANGE MASTER TO statement is written as a SQL comment and has no effect. If set to any value other than **1**, --set-gtid-purged is set to OFF.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
+              "type": "object"
+            },
+            "schemaOnly": {
+              "description": "Export only schemas.",
+              "type": "boolean"
+            },
+            "tables": {
+              "description": "Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database. For PostgreSQL instances, you can specify only one table.",
+              "items": {
+                "type": "string"
+              },
+              "type": "array"
+            }
+          },
+          "type": "object"
+        },
+        "uri": {
+          "description": "The path to the file in Google Cloud Storage where the export will be stored. The URI is in the form **gs://bucketName/fileName**. If the file already exists, the request succeeds, but the operation fails. If **fileType** is **SQL** and the filename ends with .gz, the contents are compressed.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "FailoverContext": {
+      "description": "Database instance failover context.",
+      "id": "FailoverContext",
+      "properties": {
+        "kind": {
+          "description": "This is always *sql#failoverContext*.",
+          "type": "string"
+        },
+        "settingsVersion": {
+          "description": "The current settings version of this instance. Request will be rejected if this version doesn't match the current settings version.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Flag": {
+      "description": "A flag resource.",
+      "id": "Flag",
+      "properties": {
+        "allowedIntValues": {
+          "description": "Use this field if only certain integers are accepted. Can be combined with min_value and max_value to add additional values.",
+          "items": {
+            "format": "int64",
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "allowedStringValues": {
+          "description": "For **STRING** flags, a list of strings that the value can be set to.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "appliesTo": {
+          "description": "The database version this flag applies to. Can be **MYSQL_8_0**, **MYSQL_5_6**, or **MYSQL_5_7**.",
+          "items": {
+            "enum": [
+              "SQL_DATABASE_VERSION_UNSPECIFIED",
+              "MYSQL_5_1",
+              "MYSQL_5_5",
+              "MYSQL_5_6",
+              "MYSQL_5_7",
+              "POSTGRES_9_6",
+              "POSTGRES_11",
+              "SQLSERVER_2017_STANDARD",
+              "SQLSERVER_2017_ENTERPRISE",
+              "SQLSERVER_2017_EXPRESS",
+              "SQLSERVER_2017_WEB",
+              "POSTGRES_10",
+              "POSTGRES_12",
+              "POSTGRES_13",
+              "SQLSERVER_2019_STANDARD",
+              "SQLSERVER_2019_ENTERPRISE",
+              "SQLSERVER_2019_EXPRESS",
+              "SQLSERVER_2019_WEB"
+            ],
+            "enumDescriptions": [
+              "This is an unknown database version.",
+              "The database version is MySQL 5.1.",
+              "The database version is MySQL 5.5.",
+              "The database version is MySQL 5.6.",
+              "The database version is MySQL 5.7.",
+              "The database version is PostgreSQL 9.6.",
+              "The database version is PostgreSQL 11.",
+              "The database version is SQL Server 2017 Standard.",
+              "The database version is SQL Server 2017 Enterprise.",
+              "The database version is SQL Server 2017 Express.",
+              "The database version is SQL Server 2017 Web.",
+              "The database version is PostgreSQL 10.",
+              "The database version is PostgreSQL 12.",
+              "The database version is PostgreSQL 13.",
+              "The database version is SQL Server 2019 Standard.",
+              "The database version is SQL Server 2019 Enterprise.",
+              "The database version is SQL Server 2019 Express.",
+              "The database version is SQL Server 2019 Web."
+            ],
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "inBeta": {
+          "description": "Whether or not the flag is considered in beta.",
+          "type": "boolean"
+        },
+        "kind": {
+          "description": "This is always **sql#flag**.",
+          "type": "string"
+        },
+        "maxValue": {
+          "description": "For **INTEGER** flags, the maximum allowed value.",
+          "format": "int64",
+          "type": "string"
+        },
+        "minValue": {
+          "description": "For **INTEGER** flags, the minimum allowed value.",
+          "format": "int64",
+          "type": "string"
+        },
+        "name": {
+          "description": "This is the name of the flag. Flag names always use underscores, not hyphens, for example: **max_allowed_packet**",
+          "type": "string"
+        },
+        "requiresRestart": {
+          "description": "Indicates whether changing this flag will trigger a database restart. Only applicable to Second Generation instances.",
+          "type": "boolean"
+        },
+        "type": {
+          "description": "The type of the flag. Flags are typed to being **BOOLEAN**, **STRING**, **INTEGER** or **NONE**. **NONE** is used for flags which do not take a value, such as **skip_grant_tables**.",
+          "enum": [
+            "SQL_FLAG_TYPE_UNSPECIFIED",
+            "BOOLEAN",
+            "STRING",
+            "INTEGER",
+            "NONE",
+            "MYSQL_TIMEZONE_OFFSET",
+            "FLOAT",
+            "REPEATED_STRING"
+          ],
+          "enumDescriptions": [
+            "This is an unknown flag type.",
+            "Boolean type flag.",
+            "String type flag.",
+            "Integer type flag.",
+            "Flag type used for a server startup option.",
+            "Type introduced specially for MySQL TimeZone offset. Accept a string value with the format [-12:59, 13:00].",
+            "Float type flag.",
+            "Comma-separated list of the strings in a SqlFlagType enum."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "FlagsListResponse": {
+      "description": "Flags list response.",
+      "id": "FlagsListResponse",
+      "properties": {
+        "items": {
+          "description": "List of flags.",
+          "items": {
+            "$ref": "Flag"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always **sql#flagsList**.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "GenerateEphemeralCertRequest": {
       "description": "Ephemeral certificate creation request.",
       "id": "GenerateEphemeralCertRequest",
@@ -927,6 +3092,85 @@
       },
       "type": "object"
     },
+    "ImportContext": {
+      "description": "Database instance import context.",
+      "id": "ImportContext",
+      "properties": {
+        "bakImportOptions": {
+          "description": "Import parameters specific to SQL Server .BAK files",
+          "properties": {
+            "encryptionOptions": {
+              "properties": {
+                "certPath": {
+                  "description": "Path to the Certificate (.cer) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.",
+                  "type": "string"
+                },
+                "pvkPassword": {
+                  "description": "Password that encrypts the private key",
+                  "type": "string"
+                },
+                "pvkPath": {
+                  "description": "Path to the Certificate Private Key (.pvk) in Cloud Storage, in the form **gs://bucketName/fileName**. The instance must have write permissions to the bucket and read access to the file.",
+                  "type": "string"
+                }
+              },
+              "type": "object"
+            }
+          },
+          "type": "object"
+        },
+        "csvImportOptions": {
+          "description": "Options for importing data as CSV.",
+          "properties": {
+            "columns": {
+              "description": "The columns to which CSV data is imported. If not specified, all columns of the database table are loaded with CSV data.",
+              "items": {
+                "type": "string"
+              },
+              "type": "array"
+            },
+            "table": {
+              "description": "The table to which CSV data is imported.",
+              "type": "string"
+            }
+          },
+          "type": "object"
+        },
+        "database": {
+          "description": "The target database for the import. If **fileType** is **SQL**, this field is required only if the import file does not specify a database, and is overridden by any database specification in the import file. If **fileType** is **CSV**, one database must be specified.",
+          "type": "string"
+        },
+        "fileType": {
+          "description": "The file type for the specified uri. **SQL**: The file contains SQL statements. **CSV**: The file contains CSV data.",
+          "enum": [
+            "SQL_FILE_TYPE_UNSPECIFIED",
+            "SQL",
+            "CSV",
+            "BAK"
+          ],
+          "enumDescriptions": [
+            "Unknown file type.",
+            "File containing SQL statements.",
+            "File in CSV format.",
+            ""
+          ],
+          "type": "string"
+        },
+        "importUser": {
+          "description": "The PostgreSQL user for this import operation. PostgreSQL instances only.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always **sql#importContext**.",
+          "type": "string"
+        },
+        "uri": {
+          "description": "Path to the import file in Cloud Storage, in the form **gs://bucketName/fileName**. Compressed gzip files (.gz) are supported when **fileType** is **SQL**. The instance must have write permissions to the bucket and read access to the file.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "InsightsConfig": {
       "description": "Insights configuration. This specifies when Cloud SQL Insights feature is enabled and optional configuration.",
       "id": "InsightsConfig",
@@ -936,7 +3180,7 @@
           "type": "boolean"
         },
         "queryPlansPerMinute": {
-          "description": "Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.",
+          "description": "Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.",
           "format": "int32",
           "type": "integer"
         },
@@ -956,17 +3200,57 @@
       },
       "type": "object"
     },
-    "InstanceReference": {
-      "description": "Reference to another Cloud SQL instance.",
-      "id": "InstanceReference",
+    "InstancesCloneRequest": {
+      "description": "Database instance clone request.",
+      "id": "InstancesCloneRequest",
       "properties": {
-        "name": {
-          "description": "The name of the Cloud SQL instance being referenced.",
-          "type": "string"
-        },
-        "region": {
-          "description": "The region of the Cloud SQL instance being referenced.",
-          "type": "string"
+        "cloneContext": {
+          "$ref": "CloneContext",
+          "description": "Contains details about the clone operation."
+        }
+      },
+      "type": "object"
+    },
+    "InstancesDemoteMasterRequest": {
+      "description": "Database demote primary instance request.",
+      "id": "InstancesDemoteMasterRequest",
+      "properties": {
+        "demoteMasterContext": {
+          "$ref": "DemoteMasterContext",
+          "description": "Contains details about the demoteMaster operation."
+        }
+      },
+      "type": "object"
+    },
+    "InstancesExportRequest": {
+      "description": "Database instance export request.",
+      "id": "InstancesExportRequest",
+      "properties": {
+        "exportContext": {
+          "$ref": "ExportContext",
+          "description": "Contains details about the export operation."
+        }
+      },
+      "type": "object"
+    },
+    "InstancesFailoverRequest": {
+      "description": "Instance failover request.",
+      "id": "InstancesFailoverRequest",
+      "properties": {
+        "failoverContext": {
+          "$ref": "FailoverContext",
+          "description": "Failover Context."
+        }
+      },
+      "type": "object"
+    },
+    "InstancesImportRequest": {
+      "description": "Database instance import request.",
+      "id": "InstancesImportRequest",
+      "properties": {
+        "importContext": {
+          "$ref": "ImportContext",
+          "description": "Contains details about the import operation."
         }
       },
       "type": "object"
@@ -1000,6 +3284,60 @@
       },
       "type": "object"
     },
+    "InstancesListServerCasResponse": {
+      "description": "Instances ListServerCas response.",
+      "id": "InstancesListServerCasResponse",
+      "properties": {
+        "activeVersion": {
+          "type": "string"
+        },
+        "certs": {
+          "description": "List of server CA certificates for the instance.",
+          "items": {
+            "$ref": "SslCert"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always *sql#instancesListServerCas*.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "InstancesRestoreBackupRequest": {
+      "description": "Database instance restore backup request.",
+      "id": "InstancesRestoreBackupRequest",
+      "properties": {
+        "restoreBackupContext": {
+          "$ref": "RestoreBackupContext",
+          "description": "Parameters required to perform the restore backup operation."
+        }
+      },
+      "type": "object"
+    },
+    "InstancesRotateServerCaRequest": {
+      "description": "Rotate server CA request.",
+      "id": "InstancesRotateServerCaRequest",
+      "properties": {
+        "rotateServerCaContext": {
+          "$ref": "RotateServerCaContext",
+          "description": "Contains details about the rotate server CA operation."
+        }
+      },
+      "type": "object"
+    },
+    "InstancesTruncateLogRequest": {
+      "description": "Instance truncate log request.",
+      "id": "InstancesTruncateLogRequest",
+      "properties": {
+        "truncateLogContext": {
+          "$ref": "TruncateLogContext",
+          "description": "Contains details about the truncate log operation."
+        }
+      },
+      "type": "object"
+    },
     "IpConfiguration": {
       "description": "IP Management configuration.",
       "id": "IpConfiguration",
@@ -1064,6 +3402,10 @@
       "description": "Preferred location. This specifies where a Cloud SQL instance is located. Note that if the preferred location is not available, the instance will be located as close as possible within the region. Only one location may be specified.",
       "id": "LocationPreference",
       "properties": {
+        "followGaeApplication": {
+          "description": "The App Engine application to follow, it must be in the same region as the Cloud SQL instance.",
+          "type": "string"
+        },
         "kind": {
           "description": "This is always **sql#locationPreference**.",
           "type": "string"
@@ -1098,7 +3440,7 @@
           "type": "string"
         },
         "updateTrack": {
-          "description": "Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/admin-api/rest/v1/instance-settings#maintenance-timing-2ndgen).",
+          "description": "Maintenance timing setting: **canary** (Earlier) or **stable** (Later). [Learn more] (https://cloud.google.com/sql/docs/mysql/instance-settings#maintenance-timing-2ndgen).",
           "enum": [
             "SQL_UPDATE_TRACK_UNSPECIFIED",
             "canary",
@@ -1206,6 +3548,224 @@
       },
       "type": "object"
     },
+    "Operation": {
+      "description": "An Operation resource. For successful operations that return an Operation resource, only the fields relevant to the operation are populated in the resource.",
+      "id": "Operation",
+      "properties": {
+        "backupContext": {
+          "$ref": "BackupContext",
+          "description": "The context for backup operation, if applicable."
+        },
+        "endTime": {
+          "description": "The time this operation finished in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "error": {
+          "$ref": "OperationErrors",
+          "description": "If errors occurred during processing of this operation, this field will be populated."
+        },
+        "exportContext": {
+          "$ref": "ExportContext",
+          "description": "The context for export operation, if applicable."
+        },
+        "importContext": {
+          "$ref": "ImportContext",
+          "description": "The context for import operation, if applicable."
+        },
+        "insertTime": {
+          "description": "The time this operation was enqueued in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always **sql#operation**.",
+          "type": "string"
+        },
+        "name": {
+          "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.",
+          "type": "string"
+        },
+        "operationType": {
+          "description": "The type of the operation. Valid values are: **CREATE** **DELETE** **UPDATE** **RESTART** **IMPORT** **EXPORT** **BACKUP_VOLUME** **RESTORE_VOLUME** **CREATE_USER** **DELETE_USER** **CREATE_DATABASE** **DELETE_DATABASE**",
+          "enum": [
+            "SQL_OPERATION_TYPE_UNSPECIFIED",
+            "IMPORT",
+            "EXPORT",
+            "CREATE",
+            "UPDATE",
+            "DELETE",
+            "RESTART",
+            "BACKUP",
+            "SNAPSHOT",
+            "BACKUP_VOLUME",
+            "DELETE_VOLUME",
+            "RESTORE_VOLUME",
+            "INJECT_USER",
+            "CLONE",
+            "STOP_REPLICA",
+            "START_REPLICA",
+            "PROMOTE_REPLICA",
+            "CREATE_REPLICA",
+            "CREATE_USER",
+            "DELETE_USER",
+            "UPDATE_USER",
+            "CREATE_DATABASE",
+            "DELETE_DATABASE",
+            "UPDATE_DATABASE",
+            "FAILOVER",
+            "DELETE_BACKUP",
+            "RECREATE_REPLICA",
+            "TRUNCATE_LOG",
+            "DEMOTE_MASTER",
+            "MAINTENANCE",
+            "ENABLE_PRIVATE_IP",
+            "DEFER_MAINTENANCE",
+            "CREATE_CLONE",
+            "RESCHEDULE_MAINTENANCE",
+            "START_EXTERNAL_SYNC"
+          ],
+          "enumDescriptions": [
+            "Unknown operation type.",
+            "Imports data into a Cloud SQL instance.",
+            "Exports data from a Cloud SQL instance to a Cloud Storage bucket.",
+            "Creates a new Cloud SQL instance.",
+            "Updates the settings of a Cloud SQL instance.",
+            "Deletes a Cloud SQL instance.",
+            "Restarts the Cloud SQL instance.",
+            "",
+            "",
+            "Performs instance backup.",
+            "Deletes an instance backup.",
+            "Restores an instance backup.",
+            "Injects a privileged user in mysql for MOB instances.",
+            "Clones a Cloud SQL instance.",
+            "Stops replication on a Cloud SQL read replica instance.",
+            "Starts replication on a Cloud SQL read replica instance.",
+            "Promotes a Cloud SQL replica instance.",
+            "Creates a Cloud SQL replica instance.",
+            "Creates a new user in a Cloud SQL instance.",
+            "Deletes a user from a Cloud SQL instance.",
+            "Updates an existing user in a Cloud SQL instance.",
+            "Creates a database in the Cloud SQL instance.",
+            "Deletes a database in the Cloud SQL instance.",
+            "Updates a database in the Cloud SQL instance.",
+            "Performs failover of an HA-enabled Cloud SQL failover replica.",
+            "Deletes the backup taken by a backup run.",
+            "",
+            "Truncates a general or slow log table in MySQL.",
+            "Demotes the stand-alone instance to be a Cloud SQL read replica for an external database server.",
+            "Indicates that the instance is currently in maintenance. Maintenance typically causes the instance to be unavailable for 1-3 minutes.",
+            "This field is deprecated, and will be removed in future version of API.",
+            "",
+            "Creates clone instance.",
+            "Reschedule maintenance to another time.",
+            "Starts external sync of a Cloud SQL EM replica to an external primary instance."
+          ],
+          "type": "string"
+        },
+        "selfLink": {
+          "description": "The URI of this resource.",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "The time this operation actually started in UTC timezone in [RFC 3339](https://tools.ietf.org/html/rfc3339) format, for example **2012-11-15T16:19:00.094Z**.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "status": {
+          "description": "The status of an operation. Valid values are: **PENDING** **RUNNING** **DONE** **SQL_OPERATION_STATUS_UNSPECIFIED**",
+          "enum": [
+            "SQL_OPERATION_STATUS_UNSPECIFIED",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ],
+          "enumDescriptions": [
+            "The state of the operation is unknown.",
+            "The operation has been queued, but has not started yet.",
+            "The operation is running.",
+            "The operation completed."
+          ],
+          "type": "string"
+        },
+        "targetId": {
+          "description": "Name of the database instance related to this operation.",
+          "type": "string"
+        },
+        "targetLink": {
+          "type": "string"
+        },
+        "targetProject": {
+          "description": "The project ID of the target instance related to this operation.",
+          "type": "string"
+        },
+        "user": {
+          "description": "The email address of the user who initiated this operation.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "OperationError": {
+      "description": "Database instance operation error.",
+      "id": "OperationError",
+      "properties": {
+        "code": {
+          "description": "Identifies the specific error that occurred.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always **sql#operationError**.",
+          "type": "string"
+        },
+        "message": {
+          "description": "Additional information about the error encountered.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "OperationErrors": {
+      "description": "Database instance operation errors list wrapper.",
+      "id": "OperationErrors",
+      "properties": {
+        "errors": {
+          "description": "The list of errors encountered while processing this operation.",
+          "items": {
+            "$ref": "OperationError"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always **sql#operationErrors**.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "OperationsListResponse": {
+      "description": "Operations list response.",
+      "id": "OperationsListResponse",
+      "properties": {
+        "items": {
+          "description": "List of operation resources.",
+          "items": {
+            "$ref": "Operation"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always *sql#operationsList*.",
+          "type": "string"
+        },
+        "nextPageToken": {
+          "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "ReplicaConfiguration": {
       "description": "Read-replica configuration for connecting to the primary instance.",
       "id": "ReplicaConfiguration",
@@ -1225,6 +3785,72 @@
       },
       "type": "object"
     },
+    "Reschedule": {
+      "id": "Reschedule",
+      "properties": {
+        "rescheduleType": {
+          "description": "Required. The type of the reschedule.",
+          "enum": [
+            "RESCHEDULE_TYPE_UNSPECIFIED",
+            "IMMEDIATE",
+            "NEXT_AVAILABLE_WINDOW",
+            "SPECIFIC_TIME"
+          ],
+          "enumDescriptions": [
+            "",
+            "Reschedules maintenance to happen now (within 5 minutes).",
+            "Reschedules maintenance to occur within one week from the originally scheduled day and time.",
+            "Reschedules maintenance to a specific time and day."
+          ],
+          "type": "string"
+        },
+        "scheduleTime": {
+          "description": "Optional. Timestamp when the maintenance shall be rescheduled to if reschedule_type=SPECIFIC_TIME, in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "RestoreBackupContext": {
+      "description": "Database instance restore from backup context. Backup context contains source instance id and project id.",
+      "id": "RestoreBackupContext",
+      "properties": {
+        "backupRunId": {
+          "description": "The ID of the backup run to restore from.",
+          "format": "int64",
+          "type": "string"
+        },
+        "instanceId": {
+          "description": "The ID of the instance that the backup was taken from.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always *sql#restoreBackupContext*.",
+          "type": "string"
+        },
+        "project": {
+          "description": "The full project ID of the source instance.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "RotateServerCaContext": {
+      "description": "Instance rotate server CA context.",
+      "id": "RotateServerCaContext",
+      "properties": {
+        "kind": {
+          "description": "This is always *sql#rotateServerCaContext*.",
+          "type": "string"
+        },
+        "nextVersion": {
+          "description": "The fingerprint of the next version to be rotated to. If left unspecified, will be rotated to the most recently added server CA version.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "Settings": {
       "description": "Database instance settings.",
       "id": "Settings",
@@ -1249,8 +3875,15 @@
           "$ref": "SqlActiveDirectoryConfig",
           "description": "Active Directory configuration, relevant only for Cloud SQL for SQL Server."
         },
+        "authorizedGaeApplications": {
+          "description": "The App Engine app IDs that can access this instance. (Deprecated) Applied to First Generation instances only.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
         "availabilityType": {
-          "description": "Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](/sql/docs/postgres/high-availability).",
+          "description": "Availability type. Potential values: **ZONAL**: The instance serves data from only one zone. Outages in that zone affect data accessibility. **REGIONAL**: The instance can serve data from more than one zone in a region (it is highly available). For more information, see [Overview of the High Availability Configuration](https://cloud.google.com/sql/docs/mysql/high-availability).",
           "enum": [
             "SQL_AVAILABILITY_TYPE_UNSPECIFIED",
             "ZONAL",
@@ -1405,6 +4038,113 @@
       },
       "type": "object"
     },
+    "SqlExternalSyncSettingError": {
+      "description": "External primary instance migration setting error.",
+      "id": "SqlExternalSyncSettingError",
+      "properties": {
+        "detail": {
+          "description": "Additional information about the error encountered.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "Can be *sql#externalSyncSettingError* or *sql#externalSyncSettingWarning*.",
+          "type": "string"
+        },
+        "type": {
+          "description": "Identifies the specific error that occurred.",
+          "enum": [
+            "SQL_EXTERNAL_SYNC_SETTING_ERROR_TYPE_UNSPECIFIED",
+            "CONNECTION_FAILURE",
+            "BINLOG_NOT_ENABLED",
+            "INCOMPATIBLE_DATABASE_VERSION",
+            "REPLICA_ALREADY_SETUP",
+            "INSUFFICIENT_PRIVILEGE",
+            "UNSUPPORTED_MIGRATION_TYPE",
+            "NO_PGLOGICAL_INSTALLED",
+            "PGLOGICAL_NODE_ALREADY_EXISTS",
+            "INVALID_WAL_LEVEL",
+            "INVALID_SHARED_PRELOAD_LIBRARY",
+            "INSUFFICIENT_MAX_REPLICATION_SLOTS",
+            "INSUFFICIENT_MAX_WAL_SENDERS",
+            "INSUFFICIENT_MAX_WORKER_PROCESSES",
+            "UNSUPPORTED_EXTENSIONS",
+            "INVALID_RDS_LOGICAL_REPLICATION",
+            "INVALID_LOGGING_SETUP",
+            "INVALID_DB_PARAM",
+            "UNSUPPORTED_GTID_MODE",
+            "SQLSERVER_AGENT_NOT_RUNNING",
+            "UNSUPPORTED_TABLE_DEFINITION",
+            "UNSUPPORTED_DEFINER",
+            "SQLSERVER_SERVERNAME_MISMATCH",
+            "PRIMARY_ALREADY_SETUP"
+          ],
+          "enumDescriptions": [
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "Unsupported migration type.",
+            "No pglogical extension installed on databases, applicable for postgres.",
+            "pglogical node already exists on databases, applicable for postgres.",
+            "The value of parameter wal_level is not set to logical.",
+            "The value of parameter shared_preload_libraries does not include pglogical.",
+            "The value of parameter max_replication_slots is not sufficient.",
+            "The value of parameter max_wal_senders is not sufficient.",
+            "The value of parameter max_worker_processes is not sufficient.",
+            "Extensions installed are either not supported or having unsupported versions",
+            "The value of parameter rds.logical_replication is not set to 1.",
+            "The primary instance logging setup doesn't allow EM sync.",
+            "The primary instance database parameter setup doesn't allow EM sync.",
+            "The gtid_mode is not supported, applicable for MySQL.",
+            "SQL Server Agent is not running.",
+            "The table definition is not support due to missing primary key or replica identity, applicable for postgres.",
+            "The customer has a definer that will break EM setup.",
+            "SQL Server @@SERVERNAME does not match actual host name",
+            "The primary instance has been setup and will fail the setup."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "SqlInstancesRescheduleMaintenanceRequestBody": {
+      "description": "Reschedule options for maintenance windows.",
+      "id": "SqlInstancesRescheduleMaintenanceRequestBody",
+      "properties": {
+        "reschedule": {
+          "$ref": "Reschedule",
+          "description": "Required. The type of the reschedule the user wants."
+        }
+      },
+      "type": "object"
+    },
+    "SqlInstancesVerifyExternalSyncSettingsResponse": {
+      "description": "Instance verify external sync settings response.",
+      "id": "SqlInstancesVerifyExternalSyncSettingsResponse",
+      "properties": {
+        "errors": {
+          "description": "List of migration violations.",
+          "items": {
+            "$ref": "SqlExternalSyncSettingError"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always *sql#migrationSettingErrorList*.",
+          "type": "string"
+        },
+        "warnings": {
+          "description": "List of migration warnings.",
+          "items": {
+            "$ref": "SqlExternalSyncSettingError"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "SqlOutOfDiskReport": {
       "description": "This message wraps up the information written by out-of-disk detection job.",
       "id": "SqlOutOfDiskReport",
@@ -1455,6 +4195,40 @@
       },
       "type": "object"
     },
+    "SqlServerDatabaseDetails": {
+      "description": "Represents a Sql Server database on the Cloud SQL instance.",
+      "id": "SqlServerDatabaseDetails",
+      "properties": {
+        "compatibilityLevel": {
+          "description": "The version of SQL Server with which the database is to be made compatible",
+          "format": "int32",
+          "type": "integer"
+        },
+        "recoveryModel": {
+          "description": "The recovery model of a SQL Server database",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "SqlServerUserDetails": {
+      "description": "Represents a Sql Server user on the Cloud SQL instance.",
+      "id": "SqlServerUserDetails",
+      "properties": {
+        "disabled": {
+          "description": "If the user has been disabled",
+          "type": "boolean"
+        },
+        "serverRoles": {
+          "description": "The server roles for this user",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
     "SslCert": {
       "description": "SslCerts Resource",
       "id": "SslCert",
@@ -1489,6 +4263,10 @@
           "description": "This is always sql#sslCert.",
           "type": "string"
         },
+        "selfLink": {
+          "description": "The URI of this resource.",
+          "type": "string"
+        },
         "sha1Fingerprint": {
           "description": "Sha1 Fingerprint.",
           "type": "string"
@@ -1496,6 +4274,21 @@
       },
       "type": "object"
     },
+    "SslCertDetail": {
+      "description": "SslCertDetail.",
+      "id": "SslCertDetail",
+      "properties": {
+        "certInfo": {
+          "$ref": "SslCert",
+          "description": "The public information about the cert."
+        },
+        "certPrivateKey": {
+          "description": "The private key for the client cert, in pem format. Keep private in order to protect your security.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
     "SslCertsCreateEphemeralRequest": {
       "description": "SslCerts create ephemeral certificate request.",
       "id": "SslCertsCreateEphemeralRequest",
@@ -1510,6 +4303,197 @@
         }
       },
       "type": "object"
+    },
+    "SslCertsInsertRequest": {
+      "description": "SslCerts insert request.",
+      "id": "SslCertsInsertRequest",
+      "properties": {
+        "commonName": {
+          "description": "User supplied name. Must be a distinct name from the other certificates for this instance.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "SslCertsInsertResponse": {
+      "description": "SslCert insert response.",
+      "id": "SslCertsInsertResponse",
+      "properties": {
+        "clientCert": {
+          "$ref": "SslCertDetail",
+          "description": "The new client certificate and private key."
+        },
+        "kind": {
+          "description": "This is always *sql#sslCertsInsert*.",
+          "type": "string"
+        },
+        "operation": {
+          "$ref": "Operation",
+          "description": "The operation to track the ssl certs insert request."
+        },
+        "serverCaCert": {
+          "$ref": "SslCert",
+          "description": "The server Certificate Authority's certificate. If this is missing you can force a new one to be generated by calling resetSslConfig method on instances resource."
+        }
+      },
+      "type": "object"
+    },
+    "SslCertsListResponse": {
+      "description": "SslCerts list response.",
+      "id": "SslCertsListResponse",
+      "properties": {
+        "items": {
+          "description": "List of client certificates for the instance.",
+          "items": {
+            "$ref": "SslCert"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always *sql#sslCertsList*.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "Tier": {
+      "description": "A Google Cloud SQL service tier resource.",
+      "id": "Tier",
+      "properties": {
+        "DiskQuota": {
+          "description": "The maximum disk size of this tier in bytes.",
+          "format": "int64",
+          "type": "string"
+        },
+        "RAM": {
+          "description": "The maximum RAM usage of this tier in bytes.",
+          "format": "int64",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always *sql#tier*.",
+          "type": "string"
+        },
+        "region": {
+          "description": "The applicable regions for this tier.",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "tier": {
+          "description": "An identifier for the machine type, for example, db-custom-1-3840. For related information, see Pricing.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "TiersListResponse": {
+      "description": "Tiers list response.",
+      "id": "TiersListResponse",
+      "properties": {
+        "items": {
+          "description": "List of tiers.",
+          "items": {
+            "$ref": "Tier"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always *sql#tiersList*.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "TruncateLogContext": {
+      "description": "Database Instance truncate log context.",
+      "id": "TruncateLogContext",
+      "properties": {
+        "kind": {
+          "description": "This is always *sql#truncateLogContext*.",
+          "type": "string"
+        },
+        "logType": {
+          "description": "The type of log to truncate. Valid values are *MYSQL_GENERAL_TABLE* and *MYSQL_SLOW_TABLE*.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "User": {
+      "description": "A Cloud SQL user resource.",
+      "id": "User",
+      "properties": {
+        "etag": {
+          "description": "This field is deprecated and will be removed from a future version of the API.",
+          "type": "string"
+        },
+        "host": {
+          "description": "The host name from which the user can connect. For *insert* operations, host defaults to an empty string. For *update* operations, host is specified as part of the request URL. The host name cannot be updated after insertion.",
+          "type": "string"
+        },
+        "instance": {
+          "description": "The name of the Cloud SQL instance. This does not include the project ID. Can be omitted for *update* since it is already specified on the URL.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "This is always *sql#user*.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the user in the Cloud SQL instance. Can be omitted for *update* since it is already specified in the URL.",
+          "type": "string"
+        },
+        "password": {
+          "description": "The password for the user.",
+          "type": "string"
+        },
+        "project": {
+          "description": "The project ID of the project containing the Cloud SQL database. The Google apps domain is prefixed if applicable. Can be omitted for *update* since it is already specified on the URL.",
+          "type": "string"
+        },
+        "sqlserverUserDetails": {
+          "$ref": "SqlServerUserDetails"
+        },
+        "type": {
+          "description": "The user type. It determines the method to authenticate the user during login. The default is the database's built-in user type.",
+          "enum": [
+            "BUILT_IN",
+            "CLOUD_IAM_USER",
+            "CLOUD_IAM_SERVICE_ACCOUNT"
+          ],
+          "enumDescriptions": [
+            "The database's built-in user type.",
+            "Cloud IAM user.",
+            "Cloud IAM service account."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "UsersListResponse": {
+      "description": "User list response.",
+      "id": "UsersListResponse",
+      "properties": {
+        "items": {
+          "description": "List of user resources in the instance.",
+          "items": {
+            "$ref": "User"
+          },
+          "type": "array"
+        },
+        "kind": {
+          "description": "This is always *sql#usersList*.",
+          "type": "string"
+        },
+        "nextPageToken": {
+          "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation.",
+          "type": "string"
+        }
+      },
+      "type": "object"
     }
   },
   "servicePath": "",
diff --git a/googleapiclient/discovery_cache/documents/sqladmin.v1beta4.json b/googleapiclient/discovery_cache/documents/sqladmin.v1beta4.json
index 398f725..b7b3c26 100644
--- a/googleapiclient/discovery_cache/documents/sqladmin.v1beta4.json
+++ b/googleapiclient/discovery_cache/documents/sqladmin.v1beta4.json
@@ -122,7 +122,7 @@
           ],
           "parameters": {
             "id": {
-              "description": "The ID of the Backup Run to delete. To find a Backup Run ID, use the list method.",
+              "description": "The ID of the backup run to delete. To find a backup run ID, use the list method.",
               "format": "int64",
               "location": "path",
               "required": true,
@@ -162,7 +162,7 @@
           ],
           "parameters": {
             "id": {
-              "description": "The ID of this Backup Run.",
+              "description": "The ID of this backup run.",
               "format": "int64",
               "location": "path",
               "required": true,
@@ -191,7 +191,7 @@
           ]
         },
         "insert": {
-          "description": "Creates a new backup run on demand. This method is applicable only to Second Generation instances.",
+          "description": "Creates a new backup run on demand.",
           "flatPath": "sql/v1beta4/projects/{project}/instances/{instance}/backupRuns",
           "httpMethod": "POST",
           "id": "sql.backupRuns.insert",
@@ -583,7 +583,7 @@
     "flags": {
       "methods": {
         "list": {
-          "description": "List all available database flags for Cloud SQL instances.",
+          "description": "Lists all available database flags for Cloud SQL instances.",
           "flatPath": "sql/v1beta4/flags",
           "httpMethod": "GET",
           "id": "sql.flags.list",
@@ -777,7 +777,7 @@
           ]
         },
         "failover": {
-          "description": "Failover the instance to its failover replica instance. Using this operation might cause your instance to restart.",
+          "description": "Initiates a manual failover of a high availability (HA) primary instance to a standby instance, which becomes the primary instance. Users are then rerouted to the new primary. For more information, see the Overview of high availability page in the Cloud SQL documentation. If using Legacy HA (MySQL only), this causes the instance to failover to its failover replica instance.",
           "flatPath": "sql/v1beta4/projects/{project}/instances/{instance}/failover",
           "httpMethod": "POST",
           "id": "sql.instances.failover",
@@ -1911,7 +1911,7 @@
       }
     }
   },
-  "revision": "20210627",
+  "revision": "20210715",
   "rootUrl": "https://sqladmin.googleapis.com/",
   "schemas": {
     "AclEntry": {
@@ -2073,11 +2073,11 @@
         },
         "diskEncryptionConfiguration": {
           "$ref": "DiskEncryptionConfiguration",
-          "description": "Encryption configuration specific to a backup. Applies only to Second Generation instances."
+          "description": "Encryption configuration specific to a backup."
         },
         "diskEncryptionStatus": {
           "$ref": "DiskEncryptionStatus",
-          "description": "Encryption status specific to a backup. Applies only to Second Generation instances."
+          "description": "Encryption status specific to a backup."
         },
         "endTime": {
           "description": "The time the backup operation completed in UTC timezone in RFC 3339 format, for example *2012-11-15T16:19:00.094Z*.",
@@ -2371,7 +2371,7 @@
       "id": "DatabaseFlags",
       "properties": {
         "name": {
-          "description": "The name of the flag. These flags are passed at instance startup, so include both server options and system variables for MySQL. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.",
+          "description": "The name of the flag. These flags are passed at instance startup, so include both server options and system variables. Flags are specified with underscores, not hyphens. For more information, see Configuring Database Flags in the Cloud SQL documentation.",
           "type": "string"
         },
         "value": {
@@ -2411,7 +2411,7 @@
           "type": "string"
         },
         "databaseVersion": {
-          "description": "The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, or *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.",
+          "description": "The database engine type and version. The *databaseVersion* field cannot be changed after instance creation. MySQL instances: *MYSQL_8_0*, *MYSQL_5_7* (default), or *MYSQL_5_6*. PostgreSQL instances: *POSTGRES_9_6*, *POSTGRES_10*, *POSTGRES_11*, *POSTGRES_12*, *POSTGRES_13* (default). SQL Server instances: *SQLSERVER_2019_STANDARD*, *SQLSERVER_2019_ENTERPRISE*, *SQLSERVER_2019_EXPRESS*, or *SQLSERVER_2019_WEB*, *SQLSERVER_2017_STANDARD* (default), *SQLSERVER_2017_ENTERPRISE*, *SQLSERVER_2017_EXPRESS*, or *SQLSERVER_2017_WEB*.",
           "enum": [
             "SQL_DATABASE_VERSION_UNSPECIFIED",
             "MYSQL_5_1",
@@ -2458,25 +2458,25 @@
         },
         "diskEncryptionConfiguration": {
           "$ref": "DiskEncryptionConfiguration",
-          "description": "Disk encryption configuration specific to an instance. Applies only to Second Generation instances."
+          "description": "Disk encryption configuration specific to an instance."
         },
         "diskEncryptionStatus": {
           "$ref": "DiskEncryptionStatus",
-          "description": "Disk encryption status specific to an instance. Applies only to Second Generation instances."
+          "description": "Disk encryption status specific to an instance."
         },
         "etag": {
           "description": "This field is deprecated and will be removed from a future version of the API. Use the *settings.settingsVersion* field instead.",
           "type": "string"
         },
         "failoverReplica": {
-          "description": "The name and status of the failover replica. This property is applicable only to Second Generation instances.",
+          "description": "The name and status of the failover replica.",
           "properties": {
             "available": {
               "description": "The availability status of the failover replica. A false status indicates that the failover replica is out of sync. The primary instance can only failover to the failover replica when the status is true.",
               "type": "boolean"
             },
             "name": {
-              "description": "The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn't include the project ID. This property is applicable only to Second Generation instances.",
+              "description": "The name of the failover replica. If specified at instance creation, a failover replica is created for the instance. The name doesn't include the project ID.",
               "type": "string"
             }
           },
@@ -2685,7 +2685,7 @@
           "description": "Configuration specific to read-replicas replicating from the on-premises primary instance."
         },
         "verifyGtidConsistency": {
-          "description": "Verify GTID consistency for demote operation. Default value: *True*. Second Generation instances only. Setting this flag to false enables you to bypass GTID consistency check between on-premises primary instance and Cloud SQL instance during the demotion operation but also exposes you to the risk of future replication failures. Change the value only if you know the reason for the GTID divergence and are confident that doing so will not cause any replication issues.",
+          "description": "Verify GTID consistency for demote operation. Default value: *True*. Setting this flag to false enables you to bypass GTID consistency check between on-premises primary instance and Cloud SQL instance during the demotion operation but also exposes you to the risk of future replication failures. Change the value only if you know the reason for the GTID divergence and are confident that doing so will not cause any replication issues.",
           "type": "boolean"
         }
       },
@@ -2958,7 +2958,7 @@
           "type": "string"
         },
         "requiresRestart": {
-          "description": "Indicates whether changing this flag will trigger a database restart. Only applicable to Second Generation instances.",
+          "description": "Indicates whether changing this flag will trigger a database restart.",
           "type": "boolean"
         },
         "type": {
@@ -3125,7 +3125,7 @@
           "type": "boolean"
         },
         "queryPlansPerMinute": {
-          "description": "Number of query plans generated by Insights per minute. Default is 5. Changing this will restart the database.",
+          "description": "Number of query execution plans captured by Insights per minute for all queries combined. Default is 5.",
           "format": "int32",
           "type": "integer"
         },
@@ -3898,7 +3898,7 @@
         },
         "ipConfiguration": {
           "$ref": "IpConfiguration",
-          "description": "The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled for Second Generation instances."
+          "description": "The settings for IP Management. This allows to enable or disable the instance IP and manage which external networks can connect to the instance. The IPv4 address cannot be disabled."
         },
         "kind": {
           "description": "This is always *sql#settings*.",
diff --git a/googleapiclient/discovery_cache/documents/storage.v1.json b/googleapiclient/discovery_cache/documents/storage.v1.json
index 81a6e13..a4f32b5 100644
--- a/googleapiclient/discovery_cache/documents/storage.v1.json
+++ b/googleapiclient/discovery_cache/documents/storage.v1.json
@@ -26,7 +26,7 @@
   "description": "Stores and retrieves potentially large, immutable data objects.",
   "discoveryVersion": "v1",
   "documentationLink": "https://developers.google.com/storage/docs/json_api/",
-  "etag": "\"313831343830353335313635363234373438\"",
+  "etag": "\"32333036333736303432373833323938323934\"",
   "icons": {
     "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png",
     "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png"
@@ -3230,7 +3230,7 @@
       }
     }
   },
-  "revision": "20210716",
+  "revision": "20210721",
   "rootUrl": "https://storage.googleapis.com/",
   "schemas": {
     "Bucket": {
diff --git a/googleapiclient/discovery_cache/documents/storagetransfer.v1.json b/googleapiclient/discovery_cache/documents/storagetransfer.v1.json
index 85d9fa1..b164e9f 100644
--- a/googleapiclient/discovery_cache/documents/storagetransfer.v1.json
+++ b/googleapiclient/discovery_cache/documents/storagetransfer.v1.json
@@ -434,7 +434,7 @@
       }
     }
   },
-  "revision": "20210712",
+  "revision": "20210715",
   "rootUrl": "https://storagetransfer.googleapis.com/",
   "schemas": {
     "AwsAccessKey": {
diff --git a/googleapiclient/discovery_cache/documents/streetviewpublish.v1.json b/googleapiclient/discovery_cache/documents/streetviewpublish.v1.json
index 44a49b5..e2cc6b2 100644
--- a/googleapiclient/discovery_cache/documents/streetviewpublish.v1.json
+++ b/googleapiclient/discovery_cache/documents/streetviewpublish.v1.json
@@ -375,7 +375,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://streetviewpublish.googleapis.com/",
   "schemas": {
     "BatchDeletePhotosRequest": {
diff --git a/googleapiclient/discovery_cache/documents/sts.v1.json b/googleapiclient/discovery_cache/documents/sts.v1.json
index 0251a90..b7cce72 100644
--- a/googleapiclient/discovery_cache/documents/sts.v1.json
+++ b/googleapiclient/discovery_cache/documents/sts.v1.json
@@ -131,7 +131,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://sts.googleapis.com/",
   "schemas": {
     "GoogleIdentityStsV1ExchangeTokenRequest": {
diff --git a/googleapiclient/discovery_cache/documents/sts.v1beta.json b/googleapiclient/discovery_cache/documents/sts.v1beta.json
index c3ac84d..31c70eb 100644
--- a/googleapiclient/discovery_cache/documents/sts.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/sts.v1beta.json
@@ -116,7 +116,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://sts.googleapis.com/",
   "schemas": {
     "GoogleIdentityStsV1betaExchangeTokenRequest": {
diff --git a/googleapiclient/discovery_cache/documents/tagmanager.v1.json b/googleapiclient/discovery_cache/documents/tagmanager.v1.json
index 73adfa2..6b59c5b 100644
--- a/googleapiclient/discovery_cache/documents/tagmanager.v1.json
+++ b/googleapiclient/discovery_cache/documents/tagmanager.v1.json
@@ -1932,7 +1932,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210721",
   "rootUrl": "https://tagmanager.googleapis.com/",
   "schemas": {
     "Account": {
diff --git a/googleapiclient/discovery_cache/documents/tagmanager.v2.json b/googleapiclient/discovery_cache/documents/tagmanager.v2.json
index 080fa71..009efa7 100644
--- a/googleapiclient/discovery_cache/documents/tagmanager.v2.json
+++ b/googleapiclient/discovery_cache/documents/tagmanager.v2.json
@@ -1197,7 +1197,10 @@
                             "requestPath",
                             "requestMethod",
                             "clientName",
-                            "queryString"
+                            "queryString",
+                            "serverPageLocationUrl",
+                            "serverPageLocationPath",
+                            "serverPageLocationHostname"
                           ],
                           "enumDescriptions": [
                             "",
@@ -1309,6 +1312,9 @@
                             "",
                             "",
                             "",
+                            "",
+                            "",
+                            "",
                             ""
                           ],
                           "location": "query",
@@ -1452,7 +1458,10 @@
                             "requestPath",
                             "requestMethod",
                             "clientName",
-                            "queryString"
+                            "queryString",
+                            "serverPageLocationUrl",
+                            "serverPageLocationPath",
+                            "serverPageLocationHostname"
                           ],
                           "enumDescriptions": [
                             "",
@@ -1564,6 +1573,9 @@
                             "",
                             "",
                             "",
+                            "",
+                            "",
+                            "",
                             ""
                           ],
                           "location": "query",
@@ -1735,7 +1747,10 @@
                             "requestPath",
                             "requestMethod",
                             "clientName",
-                            "queryString"
+                            "queryString",
+                            "serverPageLocationUrl",
+                            "serverPageLocationPath",
+                            "serverPageLocationHostname"
                           ],
                           "enumDescriptions": [
                             "",
@@ -1847,6 +1862,9 @@
                             "",
                             "",
                             "",
+                            "",
+                            "",
+                            "",
                             ""
                           ],
                           "location": "query",
@@ -3125,7 +3143,7 @@
       }
     }
   },
-  "revision": "20210714",
+  "revision": "20210721",
   "rootUrl": "https://tagmanager.googleapis.com/",
   "schemas": {
     "Account": {
@@ -3314,7 +3332,10 @@
             "requestPath",
             "requestMethod",
             "clientName",
-            "queryString"
+            "queryString",
+            "serverPageLocationUrl",
+            "serverPageLocationPath",
+            "serverPageLocationHostname"
           ],
           "enumDescriptions": [
             "",
@@ -3426,6 +3447,9 @@
             "",
             "",
             "",
+            "",
+            "",
+            "",
             ""
           ],
           "type": "string"
diff --git a/googleapiclient/discovery_cache/documents/tasks.v1.json b/googleapiclient/discovery_cache/documents/tasks.v1.json
index 4417030..686d4cc 100644
--- a/googleapiclient/discovery_cache/documents/tasks.v1.json
+++ b/googleapiclient/discovery_cache/documents/tasks.v1.json
@@ -566,7 +566,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://tasks.googleapis.com/",
   "schemas": {
     "Task": {
diff --git a/googleapiclient/discovery_cache/documents/testing.v1.json b/googleapiclient/discovery_cache/documents/testing.v1.json
index 5f35abf..8562746 100644
--- a/googleapiclient/discovery_cache/documents/testing.v1.json
+++ b/googleapiclient/discovery_cache/documents/testing.v1.json
@@ -282,7 +282,7 @@
       }
     }
   },
-  "revision": "20210713",
+  "revision": "20210719",
   "rootUrl": "https://testing.googleapis.com/",
   "schemas": {
     "Account": {
diff --git a/googleapiclient/discovery_cache/documents/texttospeech.v1.json b/googleapiclient/discovery_cache/documents/texttospeech.v1.json
index ed74e33..ea7cde5 100644
--- a/googleapiclient/discovery_cache/documents/texttospeech.v1.json
+++ b/googleapiclient/discovery_cache/documents/texttospeech.v1.json
@@ -153,7 +153,7 @@
       }
     }
   },
-  "revision": "20210618",
+  "revision": "20210713",
   "rootUrl": "https://texttospeech.googleapis.com/",
   "schemas": {
     "AudioConfig": {
diff --git a/googleapiclient/discovery_cache/documents/texttospeech.v1beta1.json b/googleapiclient/discovery_cache/documents/texttospeech.v1beta1.json
index b3c8e96..e18ea1a 100644
--- a/googleapiclient/discovery_cache/documents/texttospeech.v1beta1.json
+++ b/googleapiclient/discovery_cache/documents/texttospeech.v1beta1.json
@@ -153,7 +153,7 @@
       }
     }
   },
-  "revision": "20210618",
+  "revision": "20210713",
   "rootUrl": "https://texttospeech.googleapis.com/",
   "schemas": {
     "AudioConfig": {
diff --git a/googleapiclient/discovery_cache/documents/toolresults.v1beta3.json b/googleapiclient/discovery_cache/documents/toolresults.v1beta3.json
index 1d510b3..61a934d 100644
--- a/googleapiclient/discovery_cache/documents/toolresults.v1beta3.json
+++ b/googleapiclient/discovery_cache/documents/toolresults.v1beta3.json
@@ -1463,7 +1463,7 @@
       }
     }
   },
-  "revision": "20210719",
+  "revision": "20210726",
   "rootUrl": "https://toolresults.googleapis.com/",
   "schemas": {
     "ANR": {
diff --git a/googleapiclient/discovery_cache/documents/tpu.v1.json b/googleapiclient/discovery_cache/documents/tpu.v1.json
index dae38eb..50b9bf8 100644
--- a/googleapiclient/discovery_cache/documents/tpu.v1.json
+++ b/googleapiclient/discovery_cache/documents/tpu.v1.json
@@ -659,7 +659,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210721",
   "rootUrl": "https://tpu.googleapis.com/",
   "schemas": {
     "AcceleratorType": {
@@ -971,7 +971,7 @@
           "enumDescriptions": [
             "TPU node state is not known/set.",
             "TPU node is being created.",
-            "TPU node has been created and is fully usable.",
+            "TPU node has been created.",
             "TPU node is restarting.",
             "TPU node is undergoing reimaging.",
             "TPU node is being deleted.",
diff --git a/googleapiclient/discovery_cache/documents/tpu.v1alpha1.json b/googleapiclient/discovery_cache/documents/tpu.v1alpha1.json
index 6c98b07..eeb10d6 100644
--- a/googleapiclient/discovery_cache/documents/tpu.v1alpha1.json
+++ b/googleapiclient/discovery_cache/documents/tpu.v1alpha1.json
@@ -669,7 +669,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210721",
   "rootUrl": "https://tpu.googleapis.com/",
   "schemas": {
     "AcceleratorType": {
@@ -981,7 +981,7 @@
           "enumDescriptions": [
             "TPU node state is not known/set.",
             "TPU node is being created.",
-            "TPU node has been created and is fully usable.",
+            "TPU node has been created.",
             "TPU node is restarting.",
             "TPU node is undergoing reimaging.",
             "TPU node is being deleted.",
diff --git a/googleapiclient/discovery_cache/documents/trafficdirector.v2.json b/googleapiclient/discovery_cache/documents/trafficdirector.v2.json
index 3be4980..26ac6b5 100644
--- a/googleapiclient/discovery_cache/documents/trafficdirector.v2.json
+++ b/googleapiclient/discovery_cache/documents/trafficdirector.v2.json
@@ -128,7 +128,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210722",
   "rootUrl": "https://trafficdirector.googleapis.com/",
   "schemas": {
     "Address": {
diff --git a/googleapiclient/discovery_cache/documents/vectortile.v1.json b/googleapiclient/discovery_cache/documents/vectortile.v1.json
index a67738c..e0b0089 100644
--- a/googleapiclient/discovery_cache/documents/vectortile.v1.json
+++ b/googleapiclient/discovery_cache/documents/vectortile.v1.json
@@ -343,7 +343,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210723",
   "rootUrl": "https://vectortile.googleapis.com/",
   "schemas": {
     "Area": {
diff --git a/googleapiclient/discovery_cache/documents/videointelligence.v1.json b/googleapiclient/discovery_cache/documents/videointelligence.v1.json
index dc6846f..f001665 100644
--- a/googleapiclient/discovery_cache/documents/videointelligence.v1.json
+++ b/googleapiclient/discovery_cache/documents/videointelligence.v1.json
@@ -350,7 +350,7 @@
       }
     }
   },
-  "revision": "20210602",
+  "revision": "20210715",
   "rootUrl": "https://videointelligence.googleapis.com/",
   "schemas": {
     "GoogleCloudVideointelligenceV1_AnnotateVideoProgress": {
diff --git a/googleapiclient/discovery_cache/documents/videointelligence.v1beta2.json b/googleapiclient/discovery_cache/documents/videointelligence.v1beta2.json
index 27621c5..bf409d2 100644
--- a/googleapiclient/discovery_cache/documents/videointelligence.v1beta2.json
+++ b/googleapiclient/discovery_cache/documents/videointelligence.v1beta2.json
@@ -128,7 +128,7 @@
       }
     }
   },
-  "revision": "20210602",
+  "revision": "20210715",
   "rootUrl": "https://videointelligence.googleapis.com/",
   "schemas": {
     "GoogleCloudVideointelligenceV1_AnnotateVideoProgress": {
diff --git a/googleapiclient/discovery_cache/documents/videointelligence.v1p1beta1.json b/googleapiclient/discovery_cache/documents/videointelligence.v1p1beta1.json
index 4789491..0094e3b 100644
--- a/googleapiclient/discovery_cache/documents/videointelligence.v1p1beta1.json
+++ b/googleapiclient/discovery_cache/documents/videointelligence.v1p1beta1.json
@@ -128,7 +128,7 @@
       }
     }
   },
-  "revision": "20210602",
+  "revision": "20210715",
   "rootUrl": "https://videointelligence.googleapis.com/",
   "schemas": {
     "GoogleCloudVideointelligenceV1_AnnotateVideoProgress": {
diff --git a/googleapiclient/discovery_cache/documents/videointelligence.v1p2beta1.json b/googleapiclient/discovery_cache/documents/videointelligence.v1p2beta1.json
index 8da59f0..fae868b 100644
--- a/googleapiclient/discovery_cache/documents/videointelligence.v1p2beta1.json
+++ b/googleapiclient/discovery_cache/documents/videointelligence.v1p2beta1.json
@@ -128,7 +128,7 @@
       }
     }
   },
-  "revision": "20210602",
+  "revision": "20210715",
   "rootUrl": "https://videointelligence.googleapis.com/",
   "schemas": {
     "GoogleCloudVideointelligenceV1_AnnotateVideoProgress": {
diff --git a/googleapiclient/discovery_cache/documents/videointelligence.v1p3beta1.json b/googleapiclient/discovery_cache/documents/videointelligence.v1p3beta1.json
index 8e19c8c..d79e046 100644
--- a/googleapiclient/discovery_cache/documents/videointelligence.v1p3beta1.json
+++ b/googleapiclient/discovery_cache/documents/videointelligence.v1p3beta1.json
@@ -128,7 +128,7 @@
       }
     }
   },
-  "revision": "20210602",
+  "revision": "20210715",
   "rootUrl": "https://videointelligence.googleapis.com/",
   "schemas": {
     "GoogleCloudVideointelligenceV1_AnnotateVideoProgress": {
diff --git a/googleapiclient/discovery_cache/documents/vision.v1.json b/googleapiclient/discovery_cache/documents/vision.v1.json
index 0656f31..b5cf614 100644
--- a/googleapiclient/discovery_cache/documents/vision.v1.json
+++ b/googleapiclient/discovery_cache/documents/vision.v1.json
@@ -1282,7 +1282,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://vision.googleapis.com/",
   "schemas": {
     "AddProductToProductSetRequest": {
diff --git a/googleapiclient/discovery_cache/documents/vision.v1p1beta1.json b/googleapiclient/discovery_cache/documents/vision.v1p1beta1.json
index ae1f4c0..017c8cb 100644
--- a/googleapiclient/discovery_cache/documents/vision.v1p1beta1.json
+++ b/googleapiclient/discovery_cache/documents/vision.v1p1beta1.json
@@ -449,7 +449,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://vision.googleapis.com/",
   "schemas": {
     "AnnotateFileResponse": {
diff --git a/googleapiclient/discovery_cache/documents/vision.v1p2beta1.json b/googleapiclient/discovery_cache/documents/vision.v1p2beta1.json
index 9c0aef0..f1588da 100644
--- a/googleapiclient/discovery_cache/documents/vision.v1p2beta1.json
+++ b/googleapiclient/discovery_cache/documents/vision.v1p2beta1.json
@@ -449,7 +449,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210716",
   "rootUrl": "https://vision.googleapis.com/",
   "schemas": {
     "AnnotateFileResponse": {
diff --git a/googleapiclient/discovery_cache/documents/webrisk.v1.json b/googleapiclient/discovery_cache/documents/webrisk.v1.json
index 0447b90..a998db4 100644
--- a/googleapiclient/discovery_cache/documents/webrisk.v1.json
+++ b/googleapiclient/discovery_cache/documents/webrisk.v1.json
@@ -446,7 +446,7 @@
       }
     }
   },
-  "revision": "20210709",
+  "revision": "20210723",
   "rootUrl": "https://webrisk.googleapis.com/",
   "schemas": {
     "GoogleCloudWebriskV1ComputeThreatListDiffResponse": {
diff --git a/googleapiclient/discovery_cache/documents/workflowexecutions.v1.json b/googleapiclient/discovery_cache/documents/workflowexecutions.v1.json
index 34013de..66078b7 100644
--- a/googleapiclient/discovery_cache/documents/workflowexecutions.v1.json
+++ b/googleapiclient/discovery_cache/documents/workflowexecutions.v1.json
@@ -269,7 +269,7 @@
       }
     }
   },
-  "revision": "20210706",
+  "revision": "20210713",
   "rootUrl": "https://workflowexecutions.googleapis.com/",
   "schemas": {
     "CancelExecutionRequest": {
diff --git a/googleapiclient/discovery_cache/documents/workflowexecutions.v1beta.json b/googleapiclient/discovery_cache/documents/workflowexecutions.v1beta.json
index 61dc5ad..b1c0f59 100644
--- a/googleapiclient/discovery_cache/documents/workflowexecutions.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/workflowexecutions.v1beta.json
@@ -269,7 +269,7 @@
       }
     }
   },
-  "revision": "20210706",
+  "revision": "20210713",
   "rootUrl": "https://workflowexecutions.googleapis.com/",
   "schemas": {
     "CancelExecutionRequest": {
diff --git a/googleapiclient/discovery_cache/documents/workflows.v1beta.json b/googleapiclient/discovery_cache/documents/workflows.v1beta.json
index 2bc675c..aaf8597 100644
--- a/googleapiclient/discovery_cache/documents/workflows.v1beta.json
+++ b/googleapiclient/discovery_cache/documents/workflows.v1beta.json
@@ -444,7 +444,7 @@
       }
     }
   },
-  "revision": "20210707",
+  "revision": "20210714",
   "rootUrl": "https://workflows.googleapis.com/",
   "schemas": {
     "Empty": {
diff --git a/googleapiclient/discovery_cache/documents/youtube.v3.json b/googleapiclient/discovery_cache/documents/youtube.v3.json
index 34b6b94..f4757b1 100644
--- a/googleapiclient/discovery_cache/documents/youtube.v3.json
+++ b/googleapiclient/discovery_cache/documents/youtube.v3.json
@@ -3765,7 +3765,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210724",
   "rootUrl": "https://youtube.googleapis.com/",
   "schemas": {
     "AbuseReport": {
diff --git a/googleapiclient/discovery_cache/documents/youtubeAnalytics.v2.json b/googleapiclient/discovery_cache/documents/youtubeAnalytics.v2.json
index f74c8da..8ddd2c7 100644
--- a/googleapiclient/discovery_cache/documents/youtubeAnalytics.v2.json
+++ b/googleapiclient/discovery_cache/documents/youtubeAnalytics.v2.json
@@ -421,7 +421,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210719",
   "rootUrl": "https://youtubeanalytics.googleapis.com/",
   "schemas": {
     "EmptyResponse": {
diff --git a/googleapiclient/discovery_cache/documents/youtubereporting.v1.json b/googleapiclient/discovery_cache/documents/youtubereporting.v1.json
index 01c3e7b..e0e3c6e 100644
--- a/googleapiclient/discovery_cache/documents/youtubereporting.v1.json
+++ b/googleapiclient/discovery_cache/documents/youtubereporting.v1.json
@@ -411,7 +411,7 @@
       }
     }
   },
-  "revision": "20210717",
+  "revision": "20210720",
   "rootUrl": "https://youtubereporting.googleapis.com/",
   "schemas": {
     "Empty": {