<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.topics.html">topics</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(courseId, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a topic.</p>
<p class="toc_element">
  <code><a href="#delete">delete(courseId, id, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a topic.</p>
<p class="toc_element">
  <code><a href="#get">get(courseId, id, x__xgafv=None)</a></code></p>
<p class="firstline">Returns a topic.</p>
<p class="toc_element">
  <code><a href="#list">list(courseId, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns the list of topics that the requester is permitted to view.</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="#patch">patch(courseId, id, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates one or more fields of a topic.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(courseId, body=None, x__xgafv=None)</code>
  <pre>Creates a topic.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to access the
requested course, create a topic in the requested course,
or for access errors.
* `INVALID_ARGUMENT` if the request is malformed.
* `NOT_FOUND` if the requested course does not exist.

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.
    The object takes the form of:

{ # Topic created by a teacher for the course
    &quot;name&quot;: &quot;A String&quot;, # The name of the topic, generated by the user.
        # Leading and trailing whitespaces, if any, are trimmed. Also, multiple
        # consecutive whitespaces are collapsed into one inside the name. The
        # result must be a non-empty string. Topic names are case sensitive, and must
        # be no longer than 100 characters.
    &quot;topicId&quot;: &quot;A String&quot;, # Unique identifier for the topic.
        # 
        # Read-only.
    &quot;updateTime&quot;: &quot;A String&quot;, # The time the topic was last updated by the system.
        # 
        # Read-only.
    &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course.
        # 
        # Read-only.
  }

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

Returns:
  An object of the form:

    { # Topic created by a teacher for the course
      &quot;name&quot;: &quot;A String&quot;, # The name of the topic, generated by the user.
          # Leading and trailing whitespaces, if any, are trimmed. Also, multiple
          # consecutive whitespaces are collapsed into one inside the name. The
          # result must be a non-empty string. Topic names are case sensitive, and must
          # be no longer than 100 characters.
      &quot;topicId&quot;: &quot;A String&quot;, # Unique identifier for the topic.
          #
          # Read-only.
      &quot;updateTime&quot;: &quot;A String&quot;, # The time the topic was last updated by the system.
          #
          # Read-only.
      &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course.
          #
          # Read-only.
    }</pre>
</div>

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

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not allowed to delete the
requested topic or for access errors.
* `FAILED_PRECONDITION` if the requested topic has already been
deleted.
* `NOT_FOUND` if no course or topic exists with the requested ID.

Args:
  courseId: string, Identifier of the course.
This identifier can be either the Classroom-assigned identifier or an
alias. (required)
  id: string, Identifier of the topic 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(courseId, id, x__xgafv=None)</code>
  <pre>Returns a topic.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to access the
requested course or topic, or for access errors.
* `INVALID_ARGUMENT` if the request is malformed.
* `NOT_FOUND` if the requested course or topic does not exist.

Args:
  courseId: string, Identifier of the course. (required)
  id: string, Identifier of the topic. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Topic created by a teacher for the course
      &quot;name&quot;: &quot;A String&quot;, # The name of the topic, generated by the user.
          # Leading and trailing whitespaces, if any, are trimmed. Also, multiple
          # consecutive whitespaces are collapsed into one inside the name. The
          # result must be a non-empty string. Topic names are case sensitive, and must
          # be no longer than 100 characters.
      &quot;topicId&quot;: &quot;A String&quot;, # Unique identifier for the topic.
          #
          # Read-only.
      &quot;updateTime&quot;: &quot;A String&quot;, # The time the topic was last updated by the system.
          #
          # Read-only.
      &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course.
          #
          # Read-only.
    }</pre>
</div>

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

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting user is not permitted to access
the requested course or for access errors.
* `INVALID_ARGUMENT` if the request is malformed.
* `NOT_FOUND` if the requested course does not exist.

Args:
  courseId: string, Identifier of the course.
This identifier can be either the Classroom-assigned identifier or an
alias. (required)
  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 topics.
    &quot;nextPageToken&quot;: &quot;A String&quot;, # Token identifying the next page of results to return. If empty, no further
        # results are available.
    &quot;topic&quot;: [ # Topic items that match the request.
      { # Topic created by a teacher for the course
          &quot;name&quot;: &quot;A String&quot;, # The name of the topic, generated by the user.
              # Leading and trailing whitespaces, if any, are trimmed. Also, multiple
              # consecutive whitespaces are collapsed into one inside the name. The
              # result must be a non-empty string. Topic names are case sensitive, and must
              # be no longer than 100 characters.
          &quot;topicId&quot;: &quot;A String&quot;, # Unique identifier for the topic.
              #
              # Read-only.
          &quot;updateTime&quot;: &quot;A String&quot;, # The time the topic was last updated by the system.
              #
              # Read-only.
          &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course.
              #
              # Read-only.
        },
    ],
  }</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="patch">patch(courseId, id, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates one or more fields of a topic.

This method returns the following error codes:

* `PERMISSION_DENIED` if the requesting developer project did not create
the corresponding topic or for access errors.
* `INVALID_ARGUMENT` if the request is malformed.
* `NOT_FOUND` if the requested course or topic does not exist

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

{ # Topic created by a teacher for the course
    &quot;name&quot;: &quot;A String&quot;, # The name of the topic, generated by the user.
        # Leading and trailing whitespaces, if any, are trimmed. Also, multiple
        # consecutive whitespaces are collapsed into one inside the name. The
        # result must be a non-empty string. Topic names are case sensitive, and must
        # be no longer than 100 characters.
    &quot;topicId&quot;: &quot;A String&quot;, # Unique identifier for the topic.
        # 
        # Read-only.
    &quot;updateTime&quot;: &quot;A String&quot;, # The time the topic was last updated by the system.
        # 
        # Read-only.
    &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course.
        # 
        # Read-only.
  }

  updateMask: string, Mask that identifies which fields on the topic to update.
This field is required to do an update. The update fails if invalid
fields are specified. If a field supports empty values, it can be cleared
by specifying it in the update mask and not in the Topic object. If a
field that does not support empty values is included in the update mask and
not set in the Topic object, an `INVALID_ARGUMENT` error is
returned.

The following fields may be specified:

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

Returns:
  An object of the form:

    { # Topic created by a teacher for the course
      &quot;name&quot;: &quot;A String&quot;, # The name of the topic, generated by the user.
          # Leading and trailing whitespaces, if any, are trimmed. Also, multiple
          # consecutive whitespaces are collapsed into one inside the name. The
          # result must be a non-empty string. Topic names are case sensitive, and must
          # be no longer than 100 characters.
      &quot;topicId&quot;: &quot;A String&quot;, # Unique identifier for the topic.
          #
          # Read-only.
      &quot;updateTime&quot;: &quot;A String&quot;, # The time the topic was last updated by the system.
          #
          # Read-only.
      &quot;courseId&quot;: &quot;A String&quot;, # Identifier of the course.
          #
          # Read-only.
    }</pre>
</div>

</body></html>