<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="cloudidentity_v1.html">Cloud Identity API</a> . <a href="cloudidentity_v1.groups.html">groups</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="cloudidentity_v1.groups.memberships.html">memberships()</a></code>
</p>
<p class="firstline">Returns the memberships Resource.</p>

<p class="toc_element">
  <code><a href="#create">create(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a Group.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a Group.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Retrieves a Group.</p>
<p class="toc_element">
  <code><a href="#list">list(pageSize=None, view=None, parent=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists groups within a customer or a domain.</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="#lookup">lookup(groupKey_id=None, groupKey_namespace=None, x__xgafv=None)</a></code></p>
<p class="firstline">Looks up [resource</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 a Group.</p>
<p class="toc_element">
  <code><a href="#search">search(query=None, view=None, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Searches for Groups.</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="create">create(body=None, x__xgafv=None)</code>
  <pre>Creates a Group.

Args:
  body: object, The request body.
    The object takes the form of:

{ # Resource representing a Group.
    &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was last updated.
        # Output only.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was created.
        # Output only.
    &quot;name&quot;: &quot;A String&quot;, # Output only. [Resource name](https://cloud.google.com/apis/design/resource_names) of the
        # Group in the format: `groups/{group_id}`, where group_id is the unique ID
        # assigned to the Group.
        # 
        # Must be left blank while creating a Group.
    &quot;description&quot;: &quot;A String&quot;, # An extended description to help users determine the purpose of a Group. For
        # example, you can include information about who should join the Group, the
        # types of messages to send to the Group, links to FAQs about the Group, or
        # related Groups. Maximum length is 4,096 characters.
    &quot;parent&quot;: &quot;A String&quot;, # Required. Immutable. The entity under which this Group resides in Cloud Identity resource
        # hierarchy. Must be set when creating a Group, read-only afterwards.
        # 
        # Currently allowed types: `identitysources`.
    &quot;labels&quot;: { # Required. `Required`. Labels for Group resource.
        # For creating Groups under a namespace, set label key to
        # &#x27;labels/system/groups/external&#x27; and label value as empty.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;groupKey&quot;: { # An EntityKey uniquely identifies an Entity. Namespaces are used to provide # Required. Immutable. EntityKey of the Group.
        # 
        # Must be set when creating a Group, read-only afterwards.
        # isolation for IDs. A single ID can be reused across namespaces but the
        # combination of a namespace and an ID must be unique.
      &quot;id&quot;: &quot;A String&quot;, # The ID of the entity within the given namespace. The ID must be unique
          # within its namespace.
      &quot;namespace&quot;: &quot;A String&quot;, # Namespaces provide isolation for IDs, so an ID only needs to be unique
          # within its namespace.
          #
          # Namespaces are currently only created as part of IdentitySource creation
          # from Admin Console. A namespace `&quot;identitysources/{identity_source_id}&quot;` is
          # created corresponding to every Identity Source `identity_source_id`.
    },
    &quot;displayName&quot;: &quot;A String&quot;, # The Group&#x27;s display name.
  }

  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;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.
    },
    &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;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;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # 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).
      &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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &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.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Deletes a Group.

Args:
  name: string, Required. [Resource name](https://cloud.google.com/apis/design/resource_names) of the
Group in the format: `groups/{group_id}`, where `group_id` is the unique ID
assigned to the Group. (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;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.
    },
    &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;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;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # 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).
      &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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &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.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Retrieves a Group.

Args:
  name: string, Required. [Resource name](https://cloud.google.com/apis/design/resource_names) of the
Group in the format: `groups/{group_id}`, where `group_id` is the unique ID
assigned to the Group. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Resource representing a Group.
      &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was last updated.
          # Output only.
      &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was created.
          # Output only.
      &quot;name&quot;: &quot;A String&quot;, # Output only. [Resource name](https://cloud.google.com/apis/design/resource_names) of the
          # Group in the format: `groups/{group_id}`, where group_id is the unique ID
          # assigned to the Group.
          #
          # Must be left blank while creating a Group.
      &quot;description&quot;: &quot;A String&quot;, # An extended description to help users determine the purpose of a Group. For
          # example, you can include information about who should join the Group, the
          # types of messages to send to the Group, links to FAQs about the Group, or
          # related Groups. Maximum length is 4,096 characters.
      &quot;parent&quot;: &quot;A String&quot;, # Required. Immutable. The entity under which this Group resides in Cloud Identity resource
          # hierarchy. Must be set when creating a Group, read-only afterwards.
          #
          # Currently allowed types: `identitysources`.
      &quot;labels&quot;: { # Required. `Required`. Labels for Group resource.
          # For creating Groups under a namespace, set label key to
          # &#x27;labels/system/groups/external&#x27; and label value as empty.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;groupKey&quot;: { # An EntityKey uniquely identifies an Entity. Namespaces are used to provide # Required. Immutable. EntityKey of the Group.
          #
          # Must be set when creating a Group, read-only afterwards.
          # isolation for IDs. A single ID can be reused across namespaces but the
          # combination of a namespace and an ID must be unique.
        &quot;id&quot;: &quot;A String&quot;, # The ID of the entity within the given namespace. The ID must be unique
            # within its namespace.
        &quot;namespace&quot;: &quot;A String&quot;, # Namespaces provide isolation for IDs, so an ID only needs to be unique
            # within its namespace.
            #
            # Namespaces are currently only created as part of IdentitySource creation
            # from Admin Console. A namespace `&quot;identitysources/{identity_source_id}&quot;` is
            # created corresponding to every Identity Source `identity_source_id`.
      },
      &quot;displayName&quot;: &quot;A String&quot;, # The Group&#x27;s display name.
    }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(pageSize=None, view=None, parent=None, pageToken=None, x__xgafv=None)</code>
  <pre>Lists groups within a customer or a domain.

Args:
  pageSize: integer, The default page size is 200 (max 1000) for the BASIC view, and 50
(max 500) for the FULL view.
  view: string, Group resource view to be returned. Defaults to [View.BASIC]().
  parent: string, Required. Customer ID to list all groups from.
  pageToken: string, The next_page_token value returned from a previous list request, if any.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response message for ListGroups operation.
    &quot;groups&quot;: [ # Groups returned in response to list request.
        # The results are not sorted.
      { # Resource representing a Group.
          &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was last updated.
              # Output only.
          &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was created.
              # Output only.
          &quot;name&quot;: &quot;A String&quot;, # Output only. [Resource name](https://cloud.google.com/apis/design/resource_names) of the
              # Group in the format: `groups/{group_id}`, where group_id is the unique ID
              # assigned to the Group.
              #
              # Must be left blank while creating a Group.
          &quot;description&quot;: &quot;A String&quot;, # An extended description to help users determine the purpose of a Group. For
              # example, you can include information about who should join the Group, the
              # types of messages to send to the Group, links to FAQs about the Group, or
              # related Groups. Maximum length is 4,096 characters.
          &quot;parent&quot;: &quot;A String&quot;, # Required. Immutable. The entity under which this Group resides in Cloud Identity resource
              # hierarchy. Must be set when creating a Group, read-only afterwards.
              #
              # Currently allowed types: `identitysources`.
          &quot;labels&quot;: { # Required. `Required`. Labels for Group resource.
              # For creating Groups under a namespace, set label key to
              # &#x27;labels/system/groups/external&#x27; and label value as empty.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;groupKey&quot;: { # An EntityKey uniquely identifies an Entity. Namespaces are used to provide # Required. Immutable. EntityKey of the Group.
              #
              # Must be set when creating a Group, read-only afterwards.
              # isolation for IDs. A single ID can be reused across namespaces but the
              # combination of a namespace and an ID must be unique.
            &quot;id&quot;: &quot;A String&quot;, # The ID of the entity within the given namespace. The ID must be unique
                # within its namespace.
            &quot;namespace&quot;: &quot;A String&quot;, # Namespaces provide isolation for IDs, so an ID only needs to be unique
                # within its namespace.
                #
                # Namespaces are currently only created as part of IdentitySource creation
                # from Admin Console. A namespace `&quot;identitysources/{identity_source_id}&quot;` is
                # created corresponding to every Identity Source `identity_source_id`.
          },
          &quot;displayName&quot;: &quot;A String&quot;, # The Group&#x27;s display name.
        },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token to retrieve the next page of results, or empty if there are no
        # more results available for listing.
  }</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="lookup">lookup(groupKey_id=None, groupKey_namespace=None, x__xgafv=None)</code>
  <pre>Looks up [resource
name](https://cloud.google.com/apis/design/resource_names) of a Group by
its EntityKey.

Args:
  groupKey_id: string, The ID of the entity within the given namespace. The ID must be unique
within its namespace.
  groupKey_namespace: string, Namespaces provide isolation for IDs, so an ID only needs to be unique
within its namespace.

Namespaces are currently only created as part of IdentitySource creation
from Admin Console. A namespace `&quot;identitysources/{identity_source_id}&quot;` is
created corresponding to every Identity Source `identity_source_id`.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    {
    &quot;name&quot;: &quot;A String&quot;, # [Resource name](https://cloud.google.com/apis/design/resource_names) of the
        # Group in the format: `groups/{group_id}`, where `group_id` is the unique ID
        # assigned to the Group.
  }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates a Group.

Args:
  name: string, Output only. [Resource name](https://cloud.google.com/apis/design/resource_names) of the
Group in the format: `groups/{group_id}`, where group_id is the unique ID
assigned to the Group.

Must be left blank while creating a Group. (required)
  body: object, The request body.
    The object takes the form of:

{ # Resource representing a Group.
    &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was last updated.
        # Output only.
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was created.
        # Output only.
    &quot;name&quot;: &quot;A String&quot;, # Output only. [Resource name](https://cloud.google.com/apis/design/resource_names) of the
        # Group in the format: `groups/{group_id}`, where group_id is the unique ID
        # assigned to the Group.
        # 
        # Must be left blank while creating a Group.
    &quot;description&quot;: &quot;A String&quot;, # An extended description to help users determine the purpose of a Group. For
        # example, you can include information about who should join the Group, the
        # types of messages to send to the Group, links to FAQs about the Group, or
        # related Groups. Maximum length is 4,096 characters.
    &quot;parent&quot;: &quot;A String&quot;, # Required. Immutable. The entity under which this Group resides in Cloud Identity resource
        # hierarchy. Must be set when creating a Group, read-only afterwards.
        # 
        # Currently allowed types: `identitysources`.
    &quot;labels&quot;: { # Required. `Required`. Labels for Group resource.
        # For creating Groups under a namespace, set label key to
        # &#x27;labels/system/groups/external&#x27; and label value as empty.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;groupKey&quot;: { # An EntityKey uniquely identifies an Entity. Namespaces are used to provide # Required. Immutable. EntityKey of the Group.
        # 
        # Must be set when creating a Group, read-only afterwards.
        # isolation for IDs. A single ID can be reused across namespaces but the
        # combination of a namespace and an ID must be unique.
      &quot;id&quot;: &quot;A String&quot;, # The ID of the entity within the given namespace. The ID must be unique
          # within its namespace.
      &quot;namespace&quot;: &quot;A String&quot;, # Namespaces provide isolation for IDs, so an ID only needs to be unique
          # within its namespace.
          #
          # Namespaces are currently only created as part of IdentitySource creation
          # from Admin Console. A namespace `&quot;identitysources/{identity_source_id}&quot;` is
          # created corresponding to every Identity Source `identity_source_id`.
    },
    &quot;displayName&quot;: &quot;A String&quot;, # The Group&#x27;s display name.
  }

  updateMask: string, Required. Editable fields: `display_name`, `description`
  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;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.
    },
    &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;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;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # 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).
      &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;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &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.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="search">search(query=None, view=None, pageSize=None, pageToken=None, x__xgafv=None)</code>
  <pre>Searches for Groups.

Args:
  query: string, Required. `Required`. Query string for performing search on groups. Users can search
on parent and label attributes of groups.
EXACT match (&#x27;==&#x27;) is supported on parent, and CONTAINS match (&#x27;in&#x27;) is
supported on labels.
  view: string, Group resource view to be returned. Defaults to [View.BASIC]().
  pageSize: integer, The default page size is 200 (max 1000) for the BASIC view, and 50
(max 500) for the FULL view.
  pageToken: string, The next_page_token value returned from a previous search request, if any.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    {
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token to retrieve the next page of results, or empty if there are no
        # more results available for specified query.
    &quot;groups&quot;: [ # List of Groups satisfying the search query.
      { # Resource representing a Group.
          &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was last updated.
              # Output only.
          &quot;createTime&quot;: &quot;A String&quot;, # Output only. The time when the Group was created.
              # Output only.
          &quot;name&quot;: &quot;A String&quot;, # Output only. [Resource name](https://cloud.google.com/apis/design/resource_names) of the
              # Group in the format: `groups/{group_id}`, where group_id is the unique ID
              # assigned to the Group.
              #
              # Must be left blank while creating a Group.
          &quot;description&quot;: &quot;A String&quot;, # An extended description to help users determine the purpose of a Group. For
              # example, you can include information about who should join the Group, the
              # types of messages to send to the Group, links to FAQs about the Group, or
              # related Groups. Maximum length is 4,096 characters.
          &quot;parent&quot;: &quot;A String&quot;, # Required. Immutable. The entity under which this Group resides in Cloud Identity resource
              # hierarchy. Must be set when creating a Group, read-only afterwards.
              #
              # Currently allowed types: `identitysources`.
          &quot;labels&quot;: { # Required. `Required`. Labels for Group resource.
              # For creating Groups under a namespace, set label key to
              # &#x27;labels/system/groups/external&#x27; and label value as empty.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;groupKey&quot;: { # An EntityKey uniquely identifies an Entity. Namespaces are used to provide # Required. Immutable. EntityKey of the Group.
              #
              # Must be set when creating a Group, read-only afterwards.
              # isolation for IDs. A single ID can be reused across namespaces but the
              # combination of a namespace and an ID must be unique.
            &quot;id&quot;: &quot;A String&quot;, # The ID of the entity within the given namespace. The ID must be unique
                # within its namespace.
            &quot;namespace&quot;: &quot;A String&quot;, # Namespaces provide isolation for IDs, so an ID only needs to be unique
                # within its namespace.
                #
                # Namespaces are currently only created as part of IdentitySource creation
                # from Admin Console. A namespace `&quot;identitysources/{identity_source_id}&quot;` is
                # created corresponding to every Identity Source `identity_source_id`.
          },
          &quot;displayName&quot;: &quot;A String&quot;, # The Group&#x27;s display name.
        },
    ],
  }</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>