<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="servicebroker_v1beta1.html">Service Broker API</a> . <a href="servicebroker_v1beta1.projects.html">projects</a> . <a href="servicebroker_v1beta1.projects.brokers.html">brokers</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="servicebroker_v1beta1.projects.brokers.instances.html">instances()</a></code>
</p>
<p class="firstline">Returns the instances Resource.</p>

<p class="toc_element">
  <code><a href="servicebroker_v1beta1.projects.brokers.v2.html">v2()</a></code>
</p>
<p class="firstline">Returns the v2 Resource.</p>

<p class="toc_element">
  <code><a href="#create">create(parent, body, x__xgafv=None)</a></code></p>
<p class="firstline">CreateBroker creates a Broker.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">DeleteBroker deletes a Broker.</p>
<p class="toc_element">
  <code><a href="#list">list(parent, pageToken=None, x__xgafv=None, pageSize=None)</a></code></p>
<p class="firstline">ListBrokers lists brokers.</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(parent, body, x__xgafv=None)</code>
  <pre>CreateBroker creates a Broker.

Args:
  parent: string, The project in which to create broker. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Broker represents a consumable collection of Service Registry catalogs
      # exposed as an OSB Broker.
    "url": "A String", # Output only.
        # URL of the broker OSB-compliant endpoint, for example:
        # https://servicebroker.googleapis.com/projects/<project>/brokers/<broker>
    "createTime": "A String", # Output only.
        # Timestamp for when the broker was created.
    "name": "A String", # Name of the broker in the format:
        # <projects>/<project-id>/brokers/<broker>.
        # This allows for multiple brokers per project which can be used to
        # enable having custom brokers per GKE cluster, for example.
    "title": "A String", # User friendly title of the broker.
        # Limited to 1024 characters. Requests with longer titles will be rejected.
  }

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

Returns:
  An object of the form:

    { # Broker represents a consumable collection of Service Registry catalogs
        # exposed as an OSB Broker.
      "url": "A String", # Output only.
          # URL of the broker OSB-compliant endpoint, for example:
          # https://servicebroker.googleapis.com/projects/<project>/brokers/<broker>
      "createTime": "A String", # Output only.
          # Timestamp for when the broker was created.
      "name": "A String", # Name of the broker in the format:
          # <projects>/<project-id>/brokers/<broker>.
          # This allows for multiple brokers per project which can be used to
          # enable having custom brokers per GKE cluster, for example.
      "title": "A String", # User friendly title of the broker.
          # Limited to 1024 characters. Requests with longer titles will be rejected.
    }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>DeleteBroker deletes a Broker.

Args:
  name: string, The broker 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="list">list(parent, pageToken=None, x__xgafv=None, pageSize=None)</code>
  <pre>ListBrokers lists brokers.

Args:
  parent: string, Parent must match `projects/[PROJECT_ID]/brokers`. (required)
  pageToken: string, Specifies a page token to use. Set `pageToken` to a `nextPageToken`
returned by a previous list request to get the next page of results.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format
  pageSize: integer, Specifies the number of results to return per page. If there are fewer
elements than the specified number, returns all elements.
Optional. Acceptable values are 0 to 200, inclusive. (Default: 100)

Returns:
  An object of the form:

    { # The response for the `ListBrokers()` method.
    "nextPageToken": "A String", # This token allows you to get the next page of results for list requests.
        # If the number of results is larger than `pageSize`, use the `nextPageToken`
        # as a value for the query parameter `pageToken` in the next list request.
        # Subsequent list requests will have their own `nextPageToken` to continue
        # paging through the results
    "brokers": [ # The list of brokers in the container.
      { # Broker represents a consumable collection of Service Registry catalogs
            # exposed as an OSB Broker.
          "url": "A String", # Output only.
              # URL of the broker OSB-compliant endpoint, for example:
              # https://servicebroker.googleapis.com/projects/<project>/brokers/<broker>
          "createTime": "A String", # Output only.
              # Timestamp for when the broker was created.
          "name": "A String", # Name of the broker in the format:
              # <projects>/<project-id>/brokers/<broker>.
              # This allows for multiple brokers per project which can be used to
              # enable having custom brokers per GKE cluster, for example.
          "title": "A String", # User friendly title of the broker.
              # Limited to 1024 characters. Requests with longer titles will be rejected.
        },
    ],
  }</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>