<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="youtubeAnalytics_v2.html">YouTube Analytics API</a> . <a href="youtubeAnalytics_v2.groupItems.html">groupItems</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#delete">delete(onBehalfOfContentOwner=None, id=None, x__xgafv=None)</a></code></p>
<p class="firstline">Removes an item from a group.</p>
<p class="toc_element">
  <code><a href="#insert">insert(body=None, onBehalfOfContentOwner=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a group item.</p>
<p class="toc_element">
  <code><a href="#list">list(groupId=None, onBehalfOfContentOwner=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns a collection of group items that match the API request parameters.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="delete">delete(onBehalfOfContentOwner=None, id=None, x__xgafv=None)</code>
  <pre>Removes an item from a group.

Args:
  onBehalfOfContentOwner: string, This parameter can only be used in a properly authorized request. **Note:**
This parameter is intended exclusively for YouTube content partners that
own and manage many different YouTube channels.

The `onBehalfOfContentOwner` parameter indicates that the request&#x27;s
authorization credentials identify a YouTube user who is acting on behalf
of the content owner specified in the parameter value. It allows content
owners to authenticate once and get access to all their video and channel
data, without having to provide authentication credentials for each
individual channel. The account that the user authenticates with must be
linked to the specified YouTube content owner.
  id: string, The `id` parameter specifies the YouTube group item ID of the group item
that is being deleted.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Empty response.
    &quot;errors&quot;: { # Request Error information. # Apiary error details
        #
        # The presence of an error field signals that the operation
        # has failed.
      &quot;requestId&quot;: &quot;A String&quot;, # Request identifier generated by the service, which can be
          # used to identify the error in the logs
      &quot;error&quot;: [ # Specific error description and codes
        { # Describes one specific error.
          &quot;argument&quot;: [ # Error arguments, to be used when building user-friendly error messages
              # given the error domain and code.  Different error codes require different
              # arguments.
            &quot;A String&quot;,
          ],
          &quot;code&quot;: &quot;A String&quot;, # Error code in the error domain. This should correspond to
              # a value of the enum type whose name is in domain. See
              # the core error domain in error_domain.proto.
          &quot;location&quot;: &quot;A String&quot;, # Location of the error, as specified by the location type.
              #
              # If location_type is PATH, this should be a path to a field that&#x27;s
              # relative to the request, using FieldPath notation
              # (net/proto2/util/public/field_path.h).
              #
              # Examples:
              #   authenticated_user.gaia_id
              #   resource.address[2].country
          &quot;externalErrorMessage&quot;: &quot;A String&quot;, # A short explanation for the error, which can be shared outside Google.
              #
              # Please set domain, code and arguments whenever possible instead of this
              # error message so that external APIs can build safe error messages
              # themselves.
              #
              # External messages built in a RoSy interface will most likely refer to
              # information and concepts that are not available externally and should not
              # be exposed. It is safer if external APIs can understand the errors and
              # decide what the error message should look like.
          &quot;locationType&quot;: &quot;A String&quot;,
          &quot;debugInfo&quot;: &quot;A String&quot;, # Debugging information, which should not be
              # shared externally.
          &quot;domain&quot;: &quot;A String&quot;, # Error domain. RoSy services can define their own
              # domain and error codes. This should normally be
              # the name of an enum type, such as: gdata.CoreErrorDomain
        },
      ],
      &quot;code&quot;: &quot;A String&quot;, # Global error code. Deprecated and ignored.
          # Set custom error codes in ErrorProto.domain and ErrorProto.code
          # instead.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="insert">insert(body=None, onBehalfOfContentOwner=None, x__xgafv=None)</code>
  <pre>Creates a group item.

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

{ # A group item.
  &quot;errors&quot;: { # Request Error information. # Apiary error details
      #
      # The presence of an error field signals that the operation
      # has failed.
    &quot;requestId&quot;: &quot;A String&quot;, # Request identifier generated by the service, which can be
        # used to identify the error in the logs
    &quot;error&quot;: [ # Specific error description and codes
      { # Describes one specific error.
        &quot;argument&quot;: [ # Error arguments, to be used when building user-friendly error messages
            # given the error domain and code.  Different error codes require different
            # arguments.
          &quot;A String&quot;,
        ],
        &quot;code&quot;: &quot;A String&quot;, # Error code in the error domain. This should correspond to
            # a value of the enum type whose name is in domain. See
            # the core error domain in error_domain.proto.
        &quot;location&quot;: &quot;A String&quot;, # Location of the error, as specified by the location type.
            #
            # If location_type is PATH, this should be a path to a field that&#x27;s
            # relative to the request, using FieldPath notation
            # (net/proto2/util/public/field_path.h).
            #
            # Examples:
            #   authenticated_user.gaia_id
            #   resource.address[2].country
        &quot;externalErrorMessage&quot;: &quot;A String&quot;, # A short explanation for the error, which can be shared outside Google.
            #
            # Please set domain, code and arguments whenever possible instead of this
            # error message so that external APIs can build safe error messages
            # themselves.
            #
            # External messages built in a RoSy interface will most likely refer to
            # information and concepts that are not available externally and should not
            # be exposed. It is safer if external APIs can understand the errors and
            # decide what the error message should look like.
        &quot;locationType&quot;: &quot;A String&quot;,
        &quot;debugInfo&quot;: &quot;A String&quot;, # Debugging information, which should not be
            # shared externally.
        &quot;domain&quot;: &quot;A String&quot;, # Error domain. RoSy services can define their own
            # domain and error codes. This should normally be
            # the name of an enum type, such as: gdata.CoreErrorDomain
      },
    ],
    &quot;code&quot;: &quot;A String&quot;, # Global error code. Deprecated and ignored.
        # Set custom error codes in ErrorProto.domain and ErrorProto.code
        # instead.
  },
  &quot;kind&quot;: &quot;A String&quot;, # Identifies the API resource&#x27;s type. The value will be `youtube#groupItem`.
  &quot;resource&quot;: { # The `resource` object contains information that identifies the item being
      # added to the group.
    &quot;id&quot;: &quot;A String&quot;, # The channel, video, playlist, or asset ID that YouTube uses to uniquely
        # identify the item that is being added to the group.
    &quot;kind&quot;: &quot;A String&quot;, # Identifies the type of resource being added to the group.
        #
        # Valid values for this property are:
        #  * `youtube#channel`
        #  * `youtube#playlist`
        #  * `youtube#video`
        #  * `youtubePartner#asset`
  },
  &quot;groupId&quot;: &quot;A String&quot;, # The ID that YouTube uses to uniquely identify the group that contains the
      # item.
  &quot;id&quot;: &quot;A String&quot;, # The ID that YouTube uses to uniquely identify the `channel`, `video`,
      # `playlist`, or `asset` resource that is included in the group. Note that
      # this ID refers specifically to the inclusion of that resource in a
      # particular group and is different than the channel ID, video ID,
      # playlist ID, or asset ID that uniquely identifies the resource itself.
      # The `resource.id` property&#x27;s value specifies the unique channel, video,
      # playlist, or asset ID.
  &quot;etag&quot;: &quot;A String&quot;, # The Etag of this resource.
}

  onBehalfOfContentOwner: string, This parameter can only be used in a properly authorized request. **Note:**
This parameter is intended exclusively for YouTube content partners that
own and manage many different YouTube channels.

The `onBehalfOfContentOwner` parameter indicates that the request&#x27;s
authorization credentials identify a YouTube user who is acting on behalf
of the content owner specified in the parameter value. It allows content
owners to authenticate once and get access to all their video and channel
data, without having to provide authentication credentials for each
individual channel. The account that the user authenticates with must be
linked to the specified YouTube content owner.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A group item.
    &quot;errors&quot;: { # Request Error information. # Apiary error details
        #
        # The presence of an error field signals that the operation
        # has failed.
      &quot;requestId&quot;: &quot;A String&quot;, # Request identifier generated by the service, which can be
          # used to identify the error in the logs
      &quot;error&quot;: [ # Specific error description and codes
        { # Describes one specific error.
          &quot;argument&quot;: [ # Error arguments, to be used when building user-friendly error messages
              # given the error domain and code.  Different error codes require different
              # arguments.
            &quot;A String&quot;,
          ],
          &quot;code&quot;: &quot;A String&quot;, # Error code in the error domain. This should correspond to
              # a value of the enum type whose name is in domain. See
              # the core error domain in error_domain.proto.
          &quot;location&quot;: &quot;A String&quot;, # Location of the error, as specified by the location type.
              #
              # If location_type is PATH, this should be a path to a field that&#x27;s
              # relative to the request, using FieldPath notation
              # (net/proto2/util/public/field_path.h).
              #
              # Examples:
              #   authenticated_user.gaia_id
              #   resource.address[2].country
          &quot;externalErrorMessage&quot;: &quot;A String&quot;, # A short explanation for the error, which can be shared outside Google.
              #
              # Please set domain, code and arguments whenever possible instead of this
              # error message so that external APIs can build safe error messages
              # themselves.
              #
              # External messages built in a RoSy interface will most likely refer to
              # information and concepts that are not available externally and should not
              # be exposed. It is safer if external APIs can understand the errors and
              # decide what the error message should look like.
          &quot;locationType&quot;: &quot;A String&quot;,
          &quot;debugInfo&quot;: &quot;A String&quot;, # Debugging information, which should not be
              # shared externally.
          &quot;domain&quot;: &quot;A String&quot;, # Error domain. RoSy services can define their own
              # domain and error codes. This should normally be
              # the name of an enum type, such as: gdata.CoreErrorDomain
        },
      ],
      &quot;code&quot;: &quot;A String&quot;, # Global error code. Deprecated and ignored.
          # Set custom error codes in ErrorProto.domain and ErrorProto.code
          # instead.
    },
    &quot;kind&quot;: &quot;A String&quot;, # Identifies the API resource&#x27;s type. The value will be `youtube#groupItem`.
    &quot;resource&quot;: { # The `resource` object contains information that identifies the item being
        # added to the group.
      &quot;id&quot;: &quot;A String&quot;, # The channel, video, playlist, or asset ID that YouTube uses to uniquely
          # identify the item that is being added to the group.
      &quot;kind&quot;: &quot;A String&quot;, # Identifies the type of resource being added to the group.
          #
          # Valid values for this property are:
          #  * `youtube#channel`
          #  * `youtube#playlist`
          #  * `youtube#video`
          #  * `youtubePartner#asset`
    },
    &quot;groupId&quot;: &quot;A String&quot;, # The ID that YouTube uses to uniquely identify the group that contains the
        # item.
    &quot;id&quot;: &quot;A String&quot;, # The ID that YouTube uses to uniquely identify the `channel`, `video`,
        # `playlist`, or `asset` resource that is included in the group. Note that
        # this ID refers specifically to the inclusion of that resource in a
        # particular group and is different than the channel ID, video ID,
        # playlist ID, or asset ID that uniquely identifies the resource itself.
        # The `resource.id` property&#x27;s value specifies the unique channel, video,
        # playlist, or asset ID.
    &quot;etag&quot;: &quot;A String&quot;, # The Etag of this resource.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(groupId=None, onBehalfOfContentOwner=None, x__xgafv=None)</code>
  <pre>Returns a collection of group items that match the API request parameters.

Args:
  groupId: string, The `groupId` parameter specifies the unique ID of the group for which you
want to retrieve group items.
  onBehalfOfContentOwner: string, This parameter can only be used in a properly authorized request. **Note:**
This parameter is intended exclusively for YouTube content partners that
own and manage many different YouTube channels.

The `onBehalfOfContentOwner` parameter indicates that the request&#x27;s
authorization credentials identify a YouTube user who is acting on behalf
of the content owner specified in the parameter value. It allows content
owners to authenticate once and get access to all their video and channel
data, without having to provide authentication credentials for each
individual channel. The account that the user authenticates with must be
linked to the specified YouTube content owner.
  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 GroupsService.ListGroupItems.
    &quot;etag&quot;: &quot;A String&quot;, # The Etag of this resource.
    &quot;errors&quot;: { # Request Error information. # Apiary error details
        #
        # The presence of an error field signals that the operation
        # has failed.
      &quot;requestId&quot;: &quot;A String&quot;, # Request identifier generated by the service, which can be
          # used to identify the error in the logs
      &quot;error&quot;: [ # Specific error description and codes
        { # Describes one specific error.
          &quot;argument&quot;: [ # Error arguments, to be used when building user-friendly error messages
              # given the error domain and code.  Different error codes require different
              # arguments.
            &quot;A String&quot;,
          ],
          &quot;code&quot;: &quot;A String&quot;, # Error code in the error domain. This should correspond to
              # a value of the enum type whose name is in domain. See
              # the core error domain in error_domain.proto.
          &quot;location&quot;: &quot;A String&quot;, # Location of the error, as specified by the location type.
              #
              # If location_type is PATH, this should be a path to a field that&#x27;s
              # relative to the request, using FieldPath notation
              # (net/proto2/util/public/field_path.h).
              #
              # Examples:
              #   authenticated_user.gaia_id
              #   resource.address[2].country
          &quot;externalErrorMessage&quot;: &quot;A String&quot;, # A short explanation for the error, which can be shared outside Google.
              #
              # Please set domain, code and arguments whenever possible instead of this
              # error message so that external APIs can build safe error messages
              # themselves.
              #
              # External messages built in a RoSy interface will most likely refer to
              # information and concepts that are not available externally and should not
              # be exposed. It is safer if external APIs can understand the errors and
              # decide what the error message should look like.
          &quot;locationType&quot;: &quot;A String&quot;,
          &quot;debugInfo&quot;: &quot;A String&quot;, # Debugging information, which should not be
              # shared externally.
          &quot;domain&quot;: &quot;A String&quot;, # Error domain. RoSy services can define their own
              # domain and error codes. This should normally be
              # the name of an enum type, such as: gdata.CoreErrorDomain
        },
      ],
      &quot;code&quot;: &quot;A String&quot;, # Global error code. Deprecated and ignored.
          # Set custom error codes in ErrorProto.domain and ErrorProto.code
          # instead.
    },
    &quot;kind&quot;: &quot;A String&quot;, # Identifies the API resource&#x27;s type. The value will be
        # `youtube#groupItemListResponse`.
    &quot;items&quot;: [ # A list of groups that match the API request parameters. Each item in the
        # list represents a `groupItem` resource.
      { # A group item.
        &quot;errors&quot;: { # Request Error information. # Apiary error details
            #
            # The presence of an error field signals that the operation
            # has failed.
          &quot;requestId&quot;: &quot;A String&quot;, # Request identifier generated by the service, which can be
              # used to identify the error in the logs
          &quot;error&quot;: [ # Specific error description and codes
            { # Describes one specific error.
              &quot;argument&quot;: [ # Error arguments, to be used when building user-friendly error messages
                  # given the error domain and code.  Different error codes require different
                  # arguments.
                &quot;A String&quot;,
              ],
              &quot;code&quot;: &quot;A String&quot;, # Error code in the error domain. This should correspond to
                  # a value of the enum type whose name is in domain. See
                  # the core error domain in error_domain.proto.
              &quot;location&quot;: &quot;A String&quot;, # Location of the error, as specified by the location type.
                  #
                  # If location_type is PATH, this should be a path to a field that&#x27;s
                  # relative to the request, using FieldPath notation
                  # (net/proto2/util/public/field_path.h).
                  #
                  # Examples:
                  #   authenticated_user.gaia_id
                  #   resource.address[2].country
              &quot;externalErrorMessage&quot;: &quot;A String&quot;, # A short explanation for the error, which can be shared outside Google.
                  #
                  # Please set domain, code and arguments whenever possible instead of this
                  # error message so that external APIs can build safe error messages
                  # themselves.
                  #
                  # External messages built in a RoSy interface will most likely refer to
                  # information and concepts that are not available externally and should not
                  # be exposed. It is safer if external APIs can understand the errors and
                  # decide what the error message should look like.
              &quot;locationType&quot;: &quot;A String&quot;,
              &quot;debugInfo&quot;: &quot;A String&quot;, # Debugging information, which should not be
                  # shared externally.
              &quot;domain&quot;: &quot;A String&quot;, # Error domain. RoSy services can define their own
                  # domain and error codes. This should normally be
                  # the name of an enum type, such as: gdata.CoreErrorDomain
            },
          ],
          &quot;code&quot;: &quot;A String&quot;, # Global error code. Deprecated and ignored.
              # Set custom error codes in ErrorProto.domain and ErrorProto.code
              # instead.
        },
        &quot;kind&quot;: &quot;A String&quot;, # Identifies the API resource&#x27;s type. The value will be `youtube#groupItem`.
        &quot;resource&quot;: { # The `resource` object contains information that identifies the item being
            # added to the group.
          &quot;id&quot;: &quot;A String&quot;, # The channel, video, playlist, or asset ID that YouTube uses to uniquely
              # identify the item that is being added to the group.
          &quot;kind&quot;: &quot;A String&quot;, # Identifies the type of resource being added to the group.
              #
              # Valid values for this property are:
              #  * `youtube#channel`
              #  * `youtube#playlist`
              #  * `youtube#video`
              #  * `youtubePartner#asset`
        },
        &quot;groupId&quot;: &quot;A String&quot;, # The ID that YouTube uses to uniquely identify the group that contains the
            # item.
        &quot;id&quot;: &quot;A String&quot;, # The ID that YouTube uses to uniquely identify the `channel`, `video`,
            # `playlist`, or `asset` resource that is included in the group. Note that
            # this ID refers specifically to the inclusion of that resource in a
            # particular group and is different than the channel ID, video ID,
            # playlist ID, or asset ID that uniquely identifies the resource itself.
            # The `resource.id` property&#x27;s value specifies the unique channel, video,
            # playlist, or asset ID.
        &quot;etag&quot;: &quot;A String&quot;, # The Etag of this resource.
      },
    ],
  }</pre>
</div>

</body></html>