<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.invitations.html">invitations</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#accept">accept(id, x__xgafv=None)</a></code></p>
<p class="firstline">Accepts an invitation, removing it and adding the invited user to the</p>
<p class="toc_element">
  <code><a href="#create">create(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates an invitation. Only one invitation for a user and course may exist</p>
<p class="toc_element">
  <code><a href="#delete">delete(id, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes an invitation.</p>
<p class="toc_element">
  <code><a href="#get">get(id, x__xgafv=None)</a></code></p>
<p class="firstline">Returns an invitation.</p>
<p class="toc_element">
  <code><a href="#list">list(userId=None, pageToken=None, pageSize=None, courseId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns a list of invitations 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="accept">accept(id, x__xgafv=None)</code>
  <pre>Accepts an invitation, removing it and adding the invited user to the
teachers or students (as appropriate) of the specified course. Only the
invited user may accept an invitation.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to accept the
requested invitation or for access errors.
* `FAILED_PRECONDITION` for the following request errors:
    * CourseMemberLimitReached
    * CourseNotModifiable
    * CourseTeacherLimitReached
    * UserGroupsMembershipLimitReached
* `NOT_FOUND` if no invitation exists with the requested ID.

Args:
  id: string, Identifier of the invitation to accept. (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="create">create(body=None, x__xgafv=None)</code>
  <pre>Creates an invitation. Only one invitation for a user and course may exist
at a time. Delete and re-create an invitation to make changes.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to create
invitations for this course or for access errors.
* `NOT_FOUND` if the course or the user does not exist.
* `FAILED_PRECONDITION` if the requested user&#x27;s account is disabled or if
the user already has this role or a role with greater permissions.
* `ALREADY_EXISTS` if an invitation for the specified user and course
already exists.

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

{ # An invitation to join a course.
  &quot;role&quot;: &quot;A String&quot;, # Role to invite the user to have.
      # Must not be `COURSE_ROLE_UNSPECIFIED`.
  &quot;userId&quot;: &quot;A String&quot;, # Identifier of the invited user.
      # 
      # When specified as a parameter of a request, this identifier can be set to
      # 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
  &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course to invite the user to.
  &quot;id&quot;: &quot;A String&quot;, # Identifier assigned by Classroom.
      # 
      # Read-only.
}

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # An invitation to join a course.
    &quot;role&quot;: &quot;A String&quot;, # Role to invite the user to have.
        # Must not be `COURSE_ROLE_UNSPECIFIED`.
    &quot;userId&quot;: &quot;A String&quot;, # Identifier of the invited user.
        #
        # When specified as a parameter of a request, this identifier can be set to
        # 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
    &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course to invite the user to.
    &quot;id&quot;: &quot;A String&quot;, # Identifier assigned by Classroom.
        #
        # Read-only.
  }</pre>
</div>

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

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to delete the
requested invitation or for access errors.
* `NOT_FOUND` if no invitation exists with the requested ID.

Args:
  id: string, Identifier of the invitation to delete. (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(id, x__xgafv=None)</code>
  <pre>Returns an invitation.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to view the
requested invitation or for access errors.
* `NOT_FOUND` if no invitation exists with the requested ID.

Args:
  id: string, Identifier of the invitation to return. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # An invitation to join a course.
    &quot;role&quot;: &quot;A String&quot;, # Role to invite the user to have.
        # Must not be `COURSE_ROLE_UNSPECIFIED`.
    &quot;userId&quot;: &quot;A String&quot;, # Identifier of the invited user.
        #
        # When specified as a parameter of a request, this identifier can be set to
        # 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
    &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course to invite the user to.
    &quot;id&quot;: &quot;A String&quot;, # Identifier assigned by Classroom.
        #
        # Read-only.
  }</pre>
</div>

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

*Note:* At least one of `user_id` or `course_id` must be supplied. Both
fields can be supplied.

This method returns the following error codes:

* `PERMISSION_DENIED` for access errors.

Args:
  userId: string, Restricts returned invitations to those for a specific user. 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
  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 means no maximum.

The server may return fewer than the specified number of results.
  courseId: string, Restricts returned invitations to those for a course with the specified
identifier.
  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 invitations.
    &quot;invitations&quot;: [ # Invitations that match the list request.
      { # An invitation to join a course.
        &quot;role&quot;: &quot;A String&quot;, # Role to invite the user to have.
            # Must not be `COURSE_ROLE_UNSPECIFIED`.
        &quot;userId&quot;: &quot;A String&quot;, # Identifier of the invited user.
            #
            # When specified as a parameter of a request, this identifier can be set to
            # 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
        &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course to invite the user to.
        &quot;id&quot;: &quot;A String&quot;, # Identifier assigned by Classroom.
            #
            # Read-only.
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token identifying the next page of results to return. If empty, no further
        # results are available.
  }</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>