<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="classroom_v1.html">Google Classroom API</a> . <a href="classroom_v1.userProfiles.html">userProfiles</a> . <a href="classroom_v1.userProfiles.guardians.html">guardians</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#delete">delete(studentId, guardianId, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a guardian.</p>
<p class="toc_element">
  <code><a href="#get">get(studentId, guardianId, x__xgafv=None)</a></code></p>
<p class="firstline">Returns a specific guardian.</p>
<p class="toc_element">
  <code><a href="#list">list(studentId, invitedEmailAddress=None, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns a list of guardians that the requesting user is permitted to</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="delete">delete(studentId, guardianId, x__xgafv=None)</code>
  <pre>Deletes a guardian.

The guardian will no longer receive guardian notifications and the guardian
will no longer be accessible via the API.

This method returns the following error codes:

* `PERMISSION_DENIED` if no user that matches the provided `student_id`
  is visible to the requesting user, if the requesting user is not
  permitted to manage guardians for the student identified by the
  `student_id`, if guardians are not enabled for the domain in question,
  or for other access errors.
* `INVALID_ARGUMENT` if a `student_id` is specified, but its format cannot
  be recognized (it is not an email address, nor a `student_id` from the
  API).
* `NOT_FOUND` if the requesting user is permitted to modify guardians for
  the requested `student_id`, but no `Guardian` record exists for that
  student with the provided `guardian_id`.

Args:
  studentId: string, The student whose guardian is to be deleted. One of the following:

* the numeric identifier for the user
* the email address of the user
* the string literal `&quot;me&quot;`, indicating the requesting user (required)
  guardianId: string, The `id` field from a `Guardian`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(studentId, guardianId, x__xgafv=None)</code>
  <pre>Returns a specific guardian.

This method returns the following error codes:

* `PERMISSION_DENIED` if no user that matches the provided `student_id`
  is visible to the requesting user, if the requesting user is not
  permitted to view guardian information for the student identified by the
  `student_id`, if guardians are not enabled for the domain in question,
  or for other access errors.
* `INVALID_ARGUMENT` if a `student_id` is specified, but its format cannot
  be recognized (it is not an email address, nor a `student_id` from the
  API, nor the literal string `me`).
* `NOT_FOUND` if the requesting user is permitted to view guardians for
  the requested `student_id`, but no `Guardian` record exists for that
  student that matches the provided `guardian_id`.

Args:
  studentId: string, The student whose guardian is being requested. One of the following:

* the numeric identifier for the user
* the email address of the user
* the string literal `&quot;me&quot;`, indicating the requesting user (required)
  guardianId: string, The `id` field from a `Guardian`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Association between a student and a guardian of that student. The guardian
      # may receive information about the student&#x27;s course work.
    &quot;guardianProfile&quot;: { # Global information for a user. # User profile for the guardian.
      &quot;id&quot;: &quot;A String&quot;, # Identifier of the user.
          #
          # Read-only.
      &quot;permissions&quot;: [ # Global permissions of the user.
          #
          # Read-only.
        { # Global user permission description.
          &quot;permission&quot;: &quot;A String&quot;, # Permission value.
        },
      ],
      &quot;verifiedTeacher&quot;: True or False, # Represents whether a G Suite for Education user&#x27;s domain administrator has
          # explicitly verified them as being a teacher. If the user is not a member of
          # a G Suite for Education domain, than this field is always false.
          #
          # Read-only
      &quot;emailAddress&quot;: &quot;A String&quot;, # Email address of the user.
          #
          # Read-only.
      &quot;photoUrl&quot;: &quot;A String&quot;, # URL of user&#x27;s profile photo.
          #
          # Read-only.
      &quot;name&quot;: { # Details of the user&#x27;s name. # Name of the user.
          #
          # Read-only.
        &quot;fullName&quot;: &quot;A String&quot;, # The user&#x27;s full name formed by concatenating the first and last name
            # values.
            #
            # Read-only.
        &quot;familyName&quot;: &quot;A String&quot;, # The user&#x27;s last name.
            #
            # Read-only.
        &quot;givenName&quot;: &quot;A String&quot;, # The user&#x27;s first name.
            #
            # Read-only.
      },
    },
    &quot;invitedEmailAddress&quot;: &quot;A String&quot;, # The email address to which the initial guardian invitation was sent.
        # This field is only visible to domain administrators.
    &quot;studentId&quot;: &quot;A String&quot;, # Identifier for the student to whom the guardian relationship applies.
    &quot;guardianId&quot;: &quot;A String&quot;, # Identifier for the guardian.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(studentId, invitedEmailAddress=None, pageToken=None, pageSize=None, x__xgafv=None)</code>
  <pre>Returns a list of guardians that the requesting user is permitted to
view, restricted to those that match the request.

To list guardians for any student that the requesting user may view
guardians for, use the literal character `-` for the student ID.

This method returns the following error codes:

* `PERMISSION_DENIED` if a `student_id` is specified, and the requesting
  user is not permitted to view guardian information for that student, if
  `&quot;-&quot;` is specified as the `student_id` and the user is not a domain
  administrator, if guardians are not enabled for the domain in question,
  if the `invited_email_address` filter is set by a user who is not a
  domain administrator, or for other access errors.
* `INVALID_ARGUMENT` if a `student_id` is specified, but its format cannot
  be recognized (it is not an email address, nor a `student_id` from the
  API, nor the literal string `me`). May also be returned if an invalid
  `page_token` is provided.
* `NOT_FOUND` if a `student_id` is specified, and its format can be
  recognized, but Classroom has no record of that student.

Args:
  studentId: string, Filter results by the student who the guardian is linked to.
The identifier can be one of the following:

* the numeric identifier for the user
* the email address of the user
* the string literal `&quot;me&quot;`, indicating the requesting user
* the string literal `&quot;-&quot;`, indicating that results should be returned for
  all students that the requesting user has access to view. (required)
  invitedEmailAddress: string, Filter results by the email address that the original invitation was sent
to, resulting in this guardian link.
This filter can only be used by domain administrators.
  pageToken: string, nextPageToken
value returned from a previous
list call,
indicating that the subsequent page of results should be returned.

The list request
must be otherwise identical to the one that resulted in this token.
  pageSize: integer, Maximum number of items to return. Zero or unspecified indicates that the
server may assign a maximum.

The server may return fewer than the specified number of results.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response when listing guardians.
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token identifying the next page of results to return. If empty, no further
        # results are available.
    &quot;guardians&quot;: [ # Guardians on this page of results that met the criteria specified in
        # the request.
      { # Association between a student and a guardian of that student. The guardian
          # may receive information about the student&#x27;s course work.
        &quot;guardianProfile&quot;: { # Global information for a user. # User profile for the guardian.
          &quot;id&quot;: &quot;A String&quot;, # Identifier of the user.
              #
              # Read-only.
          &quot;permissions&quot;: [ # Global permissions of the user.
              #
              # Read-only.
            { # Global user permission description.
              &quot;permission&quot;: &quot;A String&quot;, # Permission value.
            },
          ],
          &quot;verifiedTeacher&quot;: True or False, # Represents whether a G Suite for Education user&#x27;s domain administrator has
              # explicitly verified them as being a teacher. If the user is not a member of
              # a G Suite for Education domain, than this field is always false.
              #
              # Read-only
          &quot;emailAddress&quot;: &quot;A String&quot;, # Email address of the user.
              #
              # Read-only.
          &quot;photoUrl&quot;: &quot;A String&quot;, # URL of user&#x27;s profile photo.
              #
              # Read-only.
          &quot;name&quot;: { # Details of the user&#x27;s name. # Name of the user.
              #
              # Read-only.
            &quot;fullName&quot;: &quot;A String&quot;, # The user&#x27;s full name formed by concatenating the first and last name
                # values.
                #
                # Read-only.
            &quot;familyName&quot;: &quot;A String&quot;, # The user&#x27;s last name.
                #
                # Read-only.
            &quot;givenName&quot;: &quot;A String&quot;, # The user&#x27;s first name.
                #
                # Read-only.
          },
        },
        &quot;invitedEmailAddress&quot;: &quot;A String&quot;, # The email address to which the initial guardian invitation was sent.
            # This field is only visible to domain administrators.
        &quot;studentId&quot;: &quot;A String&quot;, # Identifier for the student to whom the guardian relationship applies.
        &quot;guardianId&quot;: &quot;A String&quot;, # Identifier for the guardian.
      },
    ],
  }</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>