<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.courses.html">courses</a> . <a href="classroom_v1.courses.teachers.html">teachers</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(courseId, body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a teacher of a course.</p>
<p class="toc_element">
  <code><a href="#delete">delete(courseId, userId, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a teacher of a course.</p>
<p class="toc_element">
  <code><a href="#get">get(courseId, userId, x__xgafv=None)</a></code></p>
<p class="firstline">Returns a teacher of a course.</p>
<p class="toc_element">
  <code><a href="#list">list(courseId, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns a list of teachers of this course that the requester</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="create">create(courseId, body, x__xgafv=None)</code>
  <pre>Creates a teacher of a course.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not  permitted to create
teachers in this course or for access errors.
* `NOT_FOUND` if the requested course ID does not exist.
* `FAILED_PRECONDITION` if the requested user's account is disabled,
for the following request errors:
    * CourseMemberLimitReached
    * CourseNotModifiable
    * CourseTeacherLimitReached
    * UserGroupsMembershipLimitReached
* `ALREADY_EXISTS` if the user is already a teacher or student in the
course.

Args:
  courseId: string, Identifier of the course.
This identifier can be either the Classroom-assigned identifier or an
alias. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Teacher of a course.
    "courseId": "A String", # Identifier of the course.
        # 
        # Read-only.
    "profile": { # Global information for a user. # Global user information for the teacher.
        # 
        # Read-only.
      "name": { # Details of the user's name. # Name of the user.
          #
          # Read-only.
        "fullName": "A String", # The user's full name formed by concatenating the first and last name
            # values.
            #
            # Read-only.
        "givenName": "A String", # The user's first name.
            #
            # Read-only.
        "familyName": "A String", # The user's last name.
            #
            # Read-only.
      },
      "photoUrl": "A String", # URL of user's profile photo.
          #
          # Read-only.
      "emailAddress": "A String", # Email address of the user.
          #
          # Read-only.
      "verifiedTeacher": True or False, # Represents whether a G Suite for Education user'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 will always be false.
          #
          # Read-only
      "id": "A String", # Identifier of the user.
          #
          # Read-only.
      "permissions": [ # Global permissions of the user.
          #
          # Read-only.
        { # Global user permission description.
          "permission": "A String", # Permission value.
        },
      ],
    },
    "userId": "A String", # Identifier of the user.
        # 
        # When specified as a parameter of a request, this identifier can be one of
        # the following:
        # 
        # * the numeric identifier for the user
        # * the email address of the user
        # * the string literal `"me"`, indicating the requesting user
  }

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

Returns:
  An object of the form:

    { # Teacher of a course.
      "courseId": "A String", # Identifier of the course.
          #
          # Read-only.
      "profile": { # Global information for a user. # Global user information for the teacher.
          #
          # Read-only.
        "name": { # Details of the user's name. # Name of the user.
            #
            # Read-only.
          "fullName": "A String", # The user's full name formed by concatenating the first and last name
              # values.
              #
              # Read-only.
          "givenName": "A String", # The user's first name.
              #
              # Read-only.
          "familyName": "A String", # The user's last name.
              #
              # Read-only.
        },
        "photoUrl": "A String", # URL of user's profile photo.
            #
            # Read-only.
        "emailAddress": "A String", # Email address of the user.
            #
            # Read-only.
        "verifiedTeacher": True or False, # Represents whether a G Suite for Education user'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 will always be false.
            #
            # Read-only
        "id": "A String", # Identifier of the user.
            #
            # Read-only.
        "permissions": [ # Global permissions of the user.
            #
            # Read-only.
          { # Global user permission description.
            "permission": "A String", # Permission value.
          },
        ],
      },
      "userId": "A String", # Identifier of the user.
          #
          # When specified as a parameter of a request, this identifier can be one of
          # the following:
          #
          # * the numeric identifier for the user
          # * the email address of the user
          # * the string literal `"me"`, indicating the requesting user
    }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(courseId, userId, x__xgafv=None)</code>
  <pre>Deletes a teacher of a course.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to delete
teachers of this course or for access errors.
* `NOT_FOUND` if no teacher of this course has the requested ID or if the
course does not exist.
* `FAILED_PRECONDITION` if the requested ID belongs to the primary teacher
of this course.

Args:
  courseId: string, Identifier of the course.
This identifier can be either the Classroom-assigned identifier or an
alias. (required)
  userId: string, Identifier of the teacher to delete. The identifier can be one of the
following:

* the numeric identifier for the user
* the email address of the user
* the string literal `"me"`, indicating the requesting user (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(courseId, userId, x__xgafv=None)</code>
  <pre>Returns a teacher of a course.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to view
teachers of this course or for access errors.
* `NOT_FOUND` if no teacher of this course has the requested ID or if the
course does not exist.

Args:
  courseId: string, Identifier of the course.
This identifier can be either the Classroom-assigned identifier or an
alias. (required)
  userId: string, Identifier of the teacher to return. The identifier can be one of the
following:

* the numeric identifier for the user
* the email address of the user
* the string literal `"me"`, indicating the requesting user (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Teacher of a course.
      "courseId": "A String", # Identifier of the course.
          #
          # Read-only.
      "profile": { # Global information for a user. # Global user information for the teacher.
          #
          # Read-only.
        "name": { # Details of the user's name. # Name of the user.
            #
            # Read-only.
          "fullName": "A String", # The user's full name formed by concatenating the first and last name
              # values.
              #
              # Read-only.
          "givenName": "A String", # The user's first name.
              #
              # Read-only.
          "familyName": "A String", # The user's last name.
              #
              # Read-only.
        },
        "photoUrl": "A String", # URL of user's profile photo.
            #
            # Read-only.
        "emailAddress": "A String", # Email address of the user.
            #
            # Read-only.
        "verifiedTeacher": True or False, # Represents whether a G Suite for Education user'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 will always be false.
            #
            # Read-only
        "id": "A String", # Identifier of the user.
            #
            # Read-only.
        "permissions": [ # Global permissions of the user.
            #
            # Read-only.
          { # Global user permission description.
            "permission": "A String", # Permission value.
          },
        ],
      },
      "userId": "A String", # Identifier of the user.
          #
          # When specified as a parameter of a request, this identifier can be one of
          # the following:
          #
          # * the numeric identifier for the user
          # * the email address of the user
          # * the string literal `"me"`, indicating the requesting user
    }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(courseId, pageSize=None, pageToken=None, x__xgafv=None)</code>
  <pre>Returns a list of teachers of this course that the requester
is permitted to view.

This method returns the following error codes:

* `NOT_FOUND` if the course does not exist.
* `PERMISSION_DENIED` for access errors.

Args:
  courseId: string, Identifier of the course.
This identifier can be either the Classroom-assigned identifier or an
alias. (required)
  pageSize: integer, Maximum number of items to return. Zero means no maximum.

The server may return fewer than the specified number of results.
  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.
  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 teachers.
    "nextPageToken": "A String", # Token identifying the next page of results to return. If empty, no further
        # results are available.
    "teachers": [ # Teachers who match the list request.
      { # Teacher of a course.
          "courseId": "A String", # Identifier of the course.
              #
              # Read-only.
          "profile": { # Global information for a user. # Global user information for the teacher.
              #
              # Read-only.
            "name": { # Details of the user's name. # Name of the user.
                #
                # Read-only.
              "fullName": "A String", # The user's full name formed by concatenating the first and last name
                  # values.
                  #
                  # Read-only.
              "givenName": "A String", # The user's first name.
                  #
                  # Read-only.
              "familyName": "A String", # The user's last name.
                  #
                  # Read-only.
            },
            "photoUrl": "A String", # URL of user's profile photo.
                #
                # Read-only.
            "emailAddress": "A String", # Email address of the user.
                #
                # Read-only.
            "verifiedTeacher": True or False, # Represents whether a G Suite for Education user'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 will always be false.
                #
                # Read-only
            "id": "A String", # Identifier of the user.
                #
                # Read-only.
            "permissions": [ # Global permissions of the user.
                #
                # Read-only.
              { # Global user permission description.
                "permission": "A String", # Permission value.
              },
            ],
          },
          "userId": "A String", # Identifier of the user.
              #
              # When specified as a parameter of a request, this identifier can be one of
              # the following:
              #
              # * the numeric identifier for the user
              # * the email address of the user
              # * the string literal `"me"`, indicating the requesting user
        },
    ],
  }</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 'execute()' on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

</body></html>