<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="proximitybeacon_v1beta1.html">Google Proximity Beacon API</a> . <a href="proximitybeacon_v1beta1.beacons.html">beacons</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="proximitybeacon_v1beta1.beacons.attachments.html">attachments()</a></code>
</p>
<p class="firstline">Returns the attachments Resource.</p>

<p class="toc_element">
  <code><a href="proximitybeacon_v1beta1.beacons.diagnostics.html">diagnostics()</a></code>
</p>
<p class="firstline">Returns the diagnostics Resource.</p>

<p class="toc_element">
  <code><a href="#activate">activate(beaconName, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Activates a beacon. A beacon that is active will return information</p>
<p class="toc_element">
  <code><a href="#deactivate">deactivate(beaconName, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Deactivates a beacon. Once deactivated, the API will not return</p>
<p class="toc_element">
  <code><a href="#decommission">decommission(beaconName, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Decommissions the specified beacon in the service. This beacon will no</p>
<p class="toc_element">
  <code><a href="#delete">delete(beaconName, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes the specified beacon including all diagnostics data for the beacon</p>
<p class="toc_element">
  <code><a href="#get">get(beaconName, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns detailed information about the specified beacon.</p>
<p class="toc_element">
  <code><a href="#list">list(pageSize=None, projectId=None, q=None, syntax=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Searches the beacon registry for beacons that match the given search</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="#register">register(body, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Registers a previously unregistered beacon given its `advertisedId`.</p>
<p class="toc_element">
  <code><a href="#update">update(beaconName, body, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates the information about the specified beacon. **Any field that you do</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="activate">activate(beaconName, projectId=None, x__xgafv=None)</code>
  <pre>Activates a beacon. A beacon that is active will return information
and attachment data when queried via `beaconinfo.getforobserved`.
Calling this method on an already active beacon will do nothing (but
will return a successful response code).

Authenticate using an [OAuth access token](https://developers.google.com/identity/protocols/OAuth2)
from a signed-in user with **Is owner** or **Can edit** permissions in the
Google Developers Console project.

Args:
  beaconName: string, Beacon that should be activated. A beacon name has the format
"beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
the beacon and N is a code for the beacon's type. Possible values are
`3` for Eddystone-UID, `4` for Eddystone-EID, `1` for iBeacon, or `5`
for AltBeacon. For Eddystone-EID beacons, you may use either the
current EID or the beacon's "stable" UID.
Required. (required)
  projectId: string, The project id of the beacon to activate. If the project id is not
specified then the project making the request is used. The project id
must match the project that owns the beacon.
Optional.
  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="deactivate">deactivate(beaconName, projectId=None, x__xgafv=None)</code>
  <pre>Deactivates a beacon. Once deactivated, the API will not return
information nor attachment data for the beacon when queried via
`beaconinfo.getforobserved`. Calling this method on an already inactive
beacon will do nothing (but will return a successful response code).

Authenticate using an [OAuth access token](https://developers.google.com/identity/protocols/OAuth2)
from a signed-in user with **Is owner** or **Can edit** permissions in the
Google Developers Console project.

Args:
  beaconName: string, Beacon that should be deactivated. A beacon name has the format
"beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
the beacon and N is a code for the beacon's type. Possible values are
`3` for Eddystone-UID, `4` for Eddystone-EID, `1` for iBeacon, or `5`
for AltBeacon. For Eddystone-EID beacons, you may use either the
current EID or the beacon's "stable" UID.
Required. (required)
  projectId: string, The project id of the beacon to deactivate. If the project id is not
specified then the project making the request is used. The project id must
match the project that owns the beacon.
Optional.
  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="decommission">decommission(beaconName, projectId=None, x__xgafv=None)</code>
  <pre>Decommissions the specified beacon in the service. This beacon will no
longer be returned from `beaconinfo.getforobserved`. This operation is
permanent -- you will not be able to re-register a beacon with this ID
again.

Authenticate using an [OAuth access token](https://developers.google.com/identity/protocols/OAuth2)
from a signed-in user with **Is owner** or **Can edit** permissions in the
Google Developers Console project.

Args:
  beaconName: string, Beacon that should be decommissioned. A beacon name has the format
"beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
the beacon and N is a code for the beacon's type. Possible values are
`3` for Eddystone-UID, `4` for Eddystone-EID, `1` for iBeacon, or `5`
for AltBeacon. For Eddystone-EID beacons, you may use either the
current EID of the beacon's "stable" UID.
Required. (required)
  projectId: string, The project id of the beacon to decommission. If the project id is not
specified then the project making the request is used. The project id
must match the project that owns the beacon.
Optional.
  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="delete">delete(beaconName, projectId=None, x__xgafv=None)</code>
  <pre>Deletes the specified beacon including all diagnostics data for the beacon
as well as any attachments on the beacon (including those belonging to
other projects). This operation cannot be undone.

Authenticate using an [OAuth access token](https://developers.google.com/identity/protocols/OAuth2)
from a signed-in user with **Is owner** or **Can edit** permissions in the
Google Developers Console project.

Args:
  beaconName: string, Beacon that should be deleted. A beacon name has the format
"beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
the beacon and N is a code for the beacon's type. Possible values are
`3` for Eddystone-UID, `4` for Eddystone-EID, `1` for iBeacon, or `5`
for AltBeacon. For Eddystone-EID beacons, you may use either the
current EID or the beacon's "stable" UID.
Required. (required)
  projectId: string, The project id of the beacon to delete. If not provided, the project
that is making the request is used.
Optional.
  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(beaconName, projectId=None, x__xgafv=None)</code>
  <pre>Returns detailed information about the specified beacon.

Authenticate using an [OAuth access token](https://developers.google.com/identity/protocols/OAuth2)
from a signed-in user with **viewer**, **Is owner** or **Can edit**
permissions in the Google Developers Console project.

Requests may supply an Eddystone-EID beacon name in the form:
`beacons/4!beaconId` where the `beaconId` is the base16 ephemeral ID
broadcast by the beacon. The returned `Beacon` object will contain the
beacon's stable Eddystone-UID. Clients not authorized to resolve the
beacon's ephemeral Eddystone-EID broadcast will receive an error.

Args:
  beaconName: string, Resource name of this beacon. A beacon name has the format
"beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
the beacon and N is a code for the beacon's type. Possible values are
`3` for Eddystone-UID, `4` for Eddystone-EID, `1` for iBeacon, or `5`
for AltBeacon. For Eddystone-EID beacons, you may use either the
current EID or the beacon's "stable" UID.
Required. (required)
  projectId: string, The project id of the beacon to request. If the project id is not specified
then the project making the request is used. The project id must match the
project that owns the beacon.
Optional.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Details of a beacon device.
    "status": "A String", # Current status of the beacon.
        # Required.
    "description": "A String", # Free text used to identify and describe the beacon. Maximum length 140
        # characters.
        # Optional.
    "indoorLevel": { # Indoor level, a human-readable string as returned by Google Maps APIs, # The indoor level information for this beacon, if known. As returned by the
        # Google Maps API.
        # Optional.
        # useful to indicate which floor of a building a beacon is located on.
      "name": "A String", # The name of this level.
    },
    "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The location of the beacon, expressed as a latitude and longitude pair.
        # This location is given when the beacon is registered or updated. It does
        # not necessarily indicate the actual current location of the beacon.
        # Optional.
        # of doubles representing degrees latitude and degrees longitude. Unless
        # specified otherwise, this must conform to the
        # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
        # standard</a>. Values must be within normalized ranges.
        #
        # Example of normalization code in Python:
        #
        #     def NormalizeLongitude(longitude):
        #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
        #       q, r = divmod(longitude, 360.0)
        #       if r > 180.0 or (r == 180.0 and q <= -1.0):
        #         return r - 360.0
        #       return r
        #
        #     def NormalizeLatLng(latitude, longitude):
        #       """Wraps decimal degrees latitude and longitude to
        #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
        #       r = latitude % 360.0
        #       if r <= 90.0:
        #         return r, NormalizeLongitude(longitude)
        #       elif r >= 270.0:
        #         return r - 360, NormalizeLongitude(longitude)
        #       else:
        #         return 180 - r, NormalizeLongitude(longitude + 180.0)
        #
        #     assert 180.0 == NormalizeLongitude(180.0)
        #     assert -180.0 == NormalizeLongitude(-180.0)
        #     assert -179.0 == NormalizeLongitude(181.0)
        #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
        #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
        #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
        #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
        #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
        #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
        #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
        #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
        #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
        #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
      "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
      "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
    },
    "placeId": "A String", # The [Google Places API](/places/place-id) Place ID of the place where
        # the beacon is deployed. This is given when the beacon is registered or
        # updated, not automatically detected in any way.
        # Optional.
    "ephemeralIdRegistration": { # Write-only registration parameters for beacons using Eddystone-EID format. # Write-only registration parameters for beacons using Eddystone-EID
        # (remotely resolved ephemeral ID) format. This information will not be
        # populated in API responses. When submitting this data, the `advertised_id`
        # field must contain an ID of type Eddystone-UID. Any other ID type will
        # result in an error.
        # Two ways of securely registering an Eddystone-EID beacon with the service
        # are supported:
        #
        # 1. Perform an ECDH key exchange via this API, including a previous call
        #    to `GET /v1beta1/eidparams`. In this case the fields
        #    `beacon_ecdh_public_key` and `service_ecdh_public_key` should be
        #    populated and `beacon_identity_key` should not be populated. This
        #    method ensures that only the two parties in the ECDH key exchange can
        #    compute the identity key, which becomes a secret between them.
        # 2. Derive or obtain the beacon's identity key via other secure means
        #    (perhaps an ECDH key exchange between the beacon and a mobile device
        #    or any other secure method), and then submit the resulting identity key
        #    to the service. In this case `beacon_identity_key` field should be
        #    populated, and neither of `beacon_ecdh_public_key` nor
        #    `service_ecdh_public_key` fields should be. The security of this method
        #    depends on how securely the parties involved (in particular the
        #    bluetooth client) handle the identity key, and obviously on how
        #    securely the identity key was generated.
        #
        # See [the Eddystone specification](https://github.com/google/eddystone/tree/master/eddystone-eid) at GitHub.
      "rotationPeriodExponent": 42, # Indicates the nominal period between each rotation of the beacon's
          # ephemeral ID. "Nominal" because the beacon should randomize the
          # actual interval. See [the spec at github](https://github.com/google/eddystone/tree/master/eddystone-eid)
          # for details. This value corresponds to a power-of-two scaler on the
          # beacon's clock: when the scaler value is K, the beacon will begin
          # broadcasting a new ephemeral ID on average every 2^K seconds.
      "initialClockValue": "A String", # The initial clock value of the beacon. The beacon's clock must have
          # begun counting at this value immediately prior to transmitting this
          # value to the resolving service. Significant delay in transmitting this
          # value to the service risks registration or resolution failures. If a
          # value is not provided, the default is zero.
      "serviceEcdhPublicKey": "A String", # The service's public key used for the Elliptic curve Diffie-Hellman
          # key exchange. When this field is populated, `beacon_ecdh_public_key`
          # must also be populated, and `beacon_identity_key` must not be.
      "initialEid": "A String", # An initial ephemeral ID calculated using the clock value submitted as
          # `initial_clock_value`, and the secret key generated by the
          # Diffie-Hellman key exchange using `service_ecdh_public_key` and
          # `service_ecdh_public_key`. This initial EID value will be used by the
          # service to confirm that the key exchange process was successful.
      "beaconEcdhPublicKey": "A String", # The beacon's public key used for the Elliptic curve Diffie-Hellman
          # key exchange. When this field is populated, `service_ecdh_public_key`
          # must also be populated, and `beacon_identity_key` must not be.
      "beaconIdentityKey": "A String", # The private key of the beacon. If this field is populated,
          # `beacon_ecdh_public_key` and `service_ecdh_public_key` must not be
          # populated.
    },
    "advertisedId": { # Defines a unique identifier of a beacon as broadcast by the device. # The identifier of a beacon as advertised by it. This field must be
        # populated when registering. It may be empty when updating a beacon
        # record because it is ignored in updates.
        #
        # When registering a beacon that broadcasts Eddystone-EID, this field
        # should contain a "stable" Eddystone-UID that identifies the beacon and
        # links it to its attachments. The stable Eddystone-UID is only used for
        # administering the beacon.
      "type": "A String", # Specifies the identifier type.
          # Required.
      "id": "A String", # The actual beacon identifier, as broadcast by the beacon hardware. Must be
          # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
          # requests, and will be so encoded (with padding) in responses. The base64
          # encoding should be of the binary byte-stream and not any textual (such as
          # hex) representation thereof.
          # Required.
    },
    "beaconName": "A String", # Resource name of this beacon. A beacon name has the format
        # "beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
        # the beacon and N is a code for the beacon's type. Possible values are
        # `3` for Eddystone, `1` for iBeacon, or `5` for AltBeacon.
        #
        # This field must be left empty when registering. After reading a beacon,
        # clients can use the name for future operations.
    "expectedStability": "A String", # Expected location stability. This is set when the beacon is registered or
        # updated, not automatically detected in any way.
        # Optional.
    "properties": { # Properties of the beacon device, for example battery type or firmware
        # version.
        # Optional.
      "a_key": "A String",
    },
    "provisioningKey": "A String", # Some beacons may require a user to provide an authorization key before
        # changing any of its configuration (e.g. broadcast frames, transmit power).
        # This field provides a place to store and control access to that key.
        # This field is populated in responses to `GET /v1beta1/beacons/3!beaconId`
        # from users with write access to the given beacon. That is to say: If the
        # user is authorized to write the beacon's confidential data in the service,
        # the service considers them authorized to configure the beacon. Note
        # that this key grants nothing on the service, only on the beacon itself.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(pageSize=None, projectId=None, q=None, syntax=None, pageToken=None, x__xgafv=None)</code>
  <pre>Searches the beacon registry for beacons that match the given search
criteria. Only those beacons that the client has permission to list
will be returned.

Authenticate using an [OAuth access token](https://developers.google.com/identity/protocols/OAuth2)
from a signed-in user with **viewer**, **Is owner** or **Can edit**
permissions in the Google Developers Console project.

Args:
  pageSize: integer, The maximum number of records to return for this request, up to a
server-defined upper limit.
  projectId: string, The project id to list beacons under. If not present then the project
credential that made the request is used as the project.
Optional.
  q: string, Filter query string that supports the following field filters:

* **description:`"<string>"`**
  For example: **description:"Room 3"**
  Returns beacons whose description matches tokens in the string "Room 3"
  (not necessarily that exact string).
  The string must be double-quoted.
* **status:`<enum>`**
  For example: **status:active**
  Returns beacons whose status matches the given value. Values must be
  one of the Beacon.Status enum values (case insensitive). Accepts
  multiple filters which will be combined with OR logic.
* **stability:`<enum>`**
  For example: **stability:mobile**
  Returns beacons whose expected stability matches the given value.
  Values must be one of the Beacon.Stability enum values (case
  insensitive). Accepts multiple filters which will be combined with
  OR logic.
* **place\_id:`"<string>"`**
  For example: **place\_id:"ChIJVSZzVR8FdkgRXGmmm6SslKw="**
  Returns beacons explicitly registered at the given place, expressed as
  a Place ID obtained from [Google Places API](/places/place-id). Does not
  match places inside the given place. Does not consider the beacon's
  actual location (which may be different from its registered place).
  Accepts multiple filters that will be combined with OR logic. The place
  ID must be double-quoted.
* **registration\_time`[<|>|<=|>=]<integer>`**
  For example: **registration\_time>=1433116800**
  Returns beacons whose registration time matches the given filter.
  Supports the operators: <, >, <=, and >=. Timestamp must be expressed as
  an integer number of seconds since midnight January 1, 1970 UTC. Accepts
  at most two filters that will be combined with AND logic, to support
  "between" semantics. If more than two are supplied, the latter ones are
  ignored.
* **lat:`<double> lng:<double> radius:<integer>`**
  For example: **lat:51.1232343 lng:-1.093852 radius:1000**
  Returns beacons whose registered location is within the given circle.
  When any of these fields are given, all are required. Latitude and
  longitude must be decimal degrees between -90.0 and 90.0 and between
  -180.0 and 180.0 respectively. Radius must be an integer number of
  meters between 10 and 1,000,000 (1000 km).
* **property:`"<string>=<string>"`**
  For example: **property:"battery-type=CR2032"**
  Returns beacons which have a property of the given name and value.
  Supports multiple filters which will be combined with OR logic.
  The entire name=value string must be double-quoted as one string.
* **attachment\_type:`"<string>"`**
  For example: **attachment_type:"my-namespace/my-type"**
  Returns beacons having at least one attachment of the given namespaced
  type. Supports "any within this namespace" via the partial wildcard
  syntax: "my-namespace/*". Supports multiple filters which will be
  combined with OR logic. The string must be double-quoted.
* **indoor\_level:`"<string>"`**
  For example: **indoor\_level:"1"**
  Returns beacons which are located on the given indoor level. Accepts
  multiple filters that will be combined with OR logic.

Multiple filters on the same field are combined with OR logic (except
registration_time which is combined with AND logic).
Multiple filters on different fields are combined with AND logic.
Filters should be separated by spaces.

As with any HTTP query string parameter, the whole filter expression must
be URL-encoded.

Example REST request:
`GET /v1beta1/beacons?q=status:active%20lat:51.123%20lng:-1.095%20radius:1000`
  pageToken: string, A pagination token obtained from a previous request to list beacons.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response that contains list beacon results and pagination help.
    "nextPageToken": "A String", # An opaque pagination token that the client may provide in their next
        # request to retrieve the next page of results.
    "beacons": [ # The beacons that matched the search criteria.
      { # Details of a beacon device.
        "status": "A String", # Current status of the beacon.
            # Required.
        "description": "A String", # Free text used to identify and describe the beacon. Maximum length 140
            # characters.
            # Optional.
        "indoorLevel": { # Indoor level, a human-readable string as returned by Google Maps APIs, # The indoor level information for this beacon, if known. As returned by the
            # Google Maps API.
            # Optional.
            # useful to indicate which floor of a building a beacon is located on.
          "name": "A String", # The name of this level.
        },
        "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The location of the beacon, expressed as a latitude and longitude pair.
            # This location is given when the beacon is registered or updated. It does
            # not necessarily indicate the actual current location of the beacon.
            # Optional.
            # of doubles representing degrees latitude and degrees longitude. Unless
            # specified otherwise, this must conform to the
            # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
            # standard</a>. Values must be within normalized ranges.
            #
            # Example of normalization code in Python:
            #
            #     def NormalizeLongitude(longitude):
            #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
            #       q, r = divmod(longitude, 360.0)
            #       if r > 180.0 or (r == 180.0 and q <= -1.0):
            #         return r - 360.0
            #       return r
            #
            #     def NormalizeLatLng(latitude, longitude):
            #       """Wraps decimal degrees latitude and longitude to
            #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
            #       r = latitude % 360.0
            #       if r <= 90.0:
            #         return r, NormalizeLongitude(longitude)
            #       elif r >= 270.0:
            #         return r - 360, NormalizeLongitude(longitude)
            #       else:
            #         return 180 - r, NormalizeLongitude(longitude + 180.0)
            #
            #     assert 180.0 == NormalizeLongitude(180.0)
            #     assert -180.0 == NormalizeLongitude(-180.0)
            #     assert -179.0 == NormalizeLongitude(181.0)
            #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
            #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
            #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
            #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
            #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
            #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
            #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
            #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
            #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
            #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
          "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
          "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
        },
        "placeId": "A String", # The [Google Places API](/places/place-id) Place ID of the place where
            # the beacon is deployed. This is given when the beacon is registered or
            # updated, not automatically detected in any way.
            # Optional.
        "ephemeralIdRegistration": { # Write-only registration parameters for beacons using Eddystone-EID format. # Write-only registration parameters for beacons using Eddystone-EID
            # (remotely resolved ephemeral ID) format. This information will not be
            # populated in API responses. When submitting this data, the `advertised_id`
            # field must contain an ID of type Eddystone-UID. Any other ID type will
            # result in an error.
            # Two ways of securely registering an Eddystone-EID beacon with the service
            # are supported:
            #
            # 1. Perform an ECDH key exchange via this API, including a previous call
            #    to `GET /v1beta1/eidparams`. In this case the fields
            #    `beacon_ecdh_public_key` and `service_ecdh_public_key` should be
            #    populated and `beacon_identity_key` should not be populated. This
            #    method ensures that only the two parties in the ECDH key exchange can
            #    compute the identity key, which becomes a secret between them.
            # 2. Derive or obtain the beacon's identity key via other secure means
            #    (perhaps an ECDH key exchange between the beacon and a mobile device
            #    or any other secure method), and then submit the resulting identity key
            #    to the service. In this case `beacon_identity_key` field should be
            #    populated, and neither of `beacon_ecdh_public_key` nor
            #    `service_ecdh_public_key` fields should be. The security of this method
            #    depends on how securely the parties involved (in particular the
            #    bluetooth client) handle the identity key, and obviously on how
            #    securely the identity key was generated.
            #
            # See [the Eddystone specification](https://github.com/google/eddystone/tree/master/eddystone-eid) at GitHub.
          "rotationPeriodExponent": 42, # Indicates the nominal period between each rotation of the beacon's
              # ephemeral ID. "Nominal" because the beacon should randomize the
              # actual interval. See [the spec at github](https://github.com/google/eddystone/tree/master/eddystone-eid)
              # for details. This value corresponds to a power-of-two scaler on the
              # beacon's clock: when the scaler value is K, the beacon will begin
              # broadcasting a new ephemeral ID on average every 2^K seconds.
          "initialClockValue": "A String", # The initial clock value of the beacon. The beacon's clock must have
              # begun counting at this value immediately prior to transmitting this
              # value to the resolving service. Significant delay in transmitting this
              # value to the service risks registration or resolution failures. If a
              # value is not provided, the default is zero.
          "serviceEcdhPublicKey": "A String", # The service's public key used for the Elliptic curve Diffie-Hellman
              # key exchange. When this field is populated, `beacon_ecdh_public_key`
              # must also be populated, and `beacon_identity_key` must not be.
          "initialEid": "A String", # An initial ephemeral ID calculated using the clock value submitted as
              # `initial_clock_value`, and the secret key generated by the
              # Diffie-Hellman key exchange using `service_ecdh_public_key` and
              # `service_ecdh_public_key`. This initial EID value will be used by the
              # service to confirm that the key exchange process was successful.
          "beaconEcdhPublicKey": "A String", # The beacon's public key used for the Elliptic curve Diffie-Hellman
              # key exchange. When this field is populated, `service_ecdh_public_key`
              # must also be populated, and `beacon_identity_key` must not be.
          "beaconIdentityKey": "A String", # The private key of the beacon. If this field is populated,
              # `beacon_ecdh_public_key` and `service_ecdh_public_key` must not be
              # populated.
        },
        "advertisedId": { # Defines a unique identifier of a beacon as broadcast by the device. # The identifier of a beacon as advertised by it. This field must be
            # populated when registering. It may be empty when updating a beacon
            # record because it is ignored in updates.
            #
            # When registering a beacon that broadcasts Eddystone-EID, this field
            # should contain a "stable" Eddystone-UID that identifies the beacon and
            # links it to its attachments. The stable Eddystone-UID is only used for
            # administering the beacon.
          "type": "A String", # Specifies the identifier type.
              # Required.
          "id": "A String", # The actual beacon identifier, as broadcast by the beacon hardware. Must be
              # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
              # requests, and will be so encoded (with padding) in responses. The base64
              # encoding should be of the binary byte-stream and not any textual (such as
              # hex) representation thereof.
              # Required.
        },
        "beaconName": "A String", # Resource name of this beacon. A beacon name has the format
            # "beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
            # the beacon and N is a code for the beacon's type. Possible values are
            # `3` for Eddystone, `1` for iBeacon, or `5` for AltBeacon.
            #
            # This field must be left empty when registering. After reading a beacon,
            # clients can use the name for future operations.
        "expectedStability": "A String", # Expected location stability. This is set when the beacon is registered or
            # updated, not automatically detected in any way.
            # Optional.
        "properties": { # Properties of the beacon device, for example battery type or firmware
            # version.
            # Optional.
          "a_key": "A String",
        },
        "provisioningKey": "A String", # Some beacons may require a user to provide an authorization key before
            # changing any of its configuration (e.g. broadcast frames, transmit power).
            # This field provides a place to store and control access to that key.
            # This field is populated in responses to `GET /v1beta1/beacons/3!beaconId`
            # from users with write access to the given beacon. That is to say: If the
            # user is authorized to write the beacon's confidential data in the service,
            # the service considers them authorized to configure the beacon. Note
            # that this key grants nothing on the service, only on the beacon itself.
      },
    ],
    "totalCount": "A String", # Estimate of the total number of beacons matched by the query. Higher
        # values may be less accurate.
  }</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>

<div class="method">
    <code class="details" id="register">register(body, projectId=None, x__xgafv=None)</code>
  <pre>Registers a previously unregistered beacon given its `advertisedId`.
These IDs are unique within the system. An ID can be registered only once.

Authenticate using an [OAuth access token](https://developers.google.com/identity/protocols/OAuth2)
from a signed-in user with **Is owner** or **Can edit** permissions in the
Google Developers Console project.

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

{ # Details of a beacon device.
  "status": "A String", # Current status of the beacon.
      # Required.
  "description": "A String", # Free text used to identify and describe the beacon. Maximum length 140
      # characters.
      # Optional.
  "indoorLevel": { # Indoor level, a human-readable string as returned by Google Maps APIs, # The indoor level information for this beacon, if known. As returned by the
      # Google Maps API.
      # Optional.
      # useful to indicate which floor of a building a beacon is located on.
    "name": "A String", # The name of this level.
  },
  "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The location of the beacon, expressed as a latitude and longitude pair.
      # This location is given when the beacon is registered or updated. It does
      # not necessarily indicate the actual current location of the beacon.
      # Optional.
      # of doubles representing degrees latitude and degrees longitude. Unless
      # specified otherwise, this must conform to the
      # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
      # standard</a>. Values must be within normalized ranges.
      #
      # Example of normalization code in Python:
      #
      #     def NormalizeLongitude(longitude):
      #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
      #       q, r = divmod(longitude, 360.0)
      #       if r > 180.0 or (r == 180.0 and q <= -1.0):
      #         return r - 360.0
      #       return r
      #
      #     def NormalizeLatLng(latitude, longitude):
      #       """Wraps decimal degrees latitude and longitude to
      #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
      #       r = latitude % 360.0
      #       if r <= 90.0:
      #         return r, NormalizeLongitude(longitude)
      #       elif r >= 270.0:
      #         return r - 360, NormalizeLongitude(longitude)
      #       else:
      #         return 180 - r, NormalizeLongitude(longitude + 180.0)
      #
      #     assert 180.0 == NormalizeLongitude(180.0)
      #     assert -180.0 == NormalizeLongitude(-180.0)
      #     assert -179.0 == NormalizeLongitude(181.0)
      #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
      #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
      #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
      #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
      #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
      #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
      #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
      #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
      #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
      #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
    "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
    "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
  },
  "placeId": "A String", # The [Google Places API](/places/place-id) Place ID of the place where
      # the beacon is deployed. This is given when the beacon is registered or
      # updated, not automatically detected in any way.
      # Optional.
  "ephemeralIdRegistration": { # Write-only registration parameters for beacons using Eddystone-EID format. # Write-only registration parameters for beacons using Eddystone-EID
      # (remotely resolved ephemeral ID) format. This information will not be
      # populated in API responses. When submitting this data, the `advertised_id`
      # field must contain an ID of type Eddystone-UID. Any other ID type will
      # result in an error.
      # Two ways of securely registering an Eddystone-EID beacon with the service
      # are supported:
      #
      # 1. Perform an ECDH key exchange via this API, including a previous call
      #    to `GET /v1beta1/eidparams`. In this case the fields
      #    `beacon_ecdh_public_key` and `service_ecdh_public_key` should be
      #    populated and `beacon_identity_key` should not be populated. This
      #    method ensures that only the two parties in the ECDH key exchange can
      #    compute the identity key, which becomes a secret between them.
      # 2. Derive or obtain the beacon's identity key via other secure means
      #    (perhaps an ECDH key exchange between the beacon and a mobile device
      #    or any other secure method), and then submit the resulting identity key
      #    to the service. In this case `beacon_identity_key` field should be
      #    populated, and neither of `beacon_ecdh_public_key` nor
      #    `service_ecdh_public_key` fields should be. The security of this method
      #    depends on how securely the parties involved (in particular the
      #    bluetooth client) handle the identity key, and obviously on how
      #    securely the identity key was generated.
      #
      # See [the Eddystone specification](https://github.com/google/eddystone/tree/master/eddystone-eid) at GitHub.
    "rotationPeriodExponent": 42, # Indicates the nominal period between each rotation of the beacon's
        # ephemeral ID. "Nominal" because the beacon should randomize the
        # actual interval. See [the spec at github](https://github.com/google/eddystone/tree/master/eddystone-eid)
        # for details. This value corresponds to a power-of-two scaler on the
        # beacon's clock: when the scaler value is K, the beacon will begin
        # broadcasting a new ephemeral ID on average every 2^K seconds.
    "initialClockValue": "A String", # The initial clock value of the beacon. The beacon's clock must have
        # begun counting at this value immediately prior to transmitting this
        # value to the resolving service. Significant delay in transmitting this
        # value to the service risks registration or resolution failures. If a
        # value is not provided, the default is zero.
    "serviceEcdhPublicKey": "A String", # The service's public key used for the Elliptic curve Diffie-Hellman
        # key exchange. When this field is populated, `beacon_ecdh_public_key`
        # must also be populated, and `beacon_identity_key` must not be.
    "initialEid": "A String", # An initial ephemeral ID calculated using the clock value submitted as
        # `initial_clock_value`, and the secret key generated by the
        # Diffie-Hellman key exchange using `service_ecdh_public_key` and
        # `service_ecdh_public_key`. This initial EID value will be used by the
        # service to confirm that the key exchange process was successful.
    "beaconEcdhPublicKey": "A String", # The beacon's public key used for the Elliptic curve Diffie-Hellman
        # key exchange. When this field is populated, `service_ecdh_public_key`
        # must also be populated, and `beacon_identity_key` must not be.
    "beaconIdentityKey": "A String", # The private key of the beacon. If this field is populated,
        # `beacon_ecdh_public_key` and `service_ecdh_public_key` must not be
        # populated.
  },
  "advertisedId": { # Defines a unique identifier of a beacon as broadcast by the device. # The identifier of a beacon as advertised by it. This field must be
      # populated when registering. It may be empty when updating a beacon
      # record because it is ignored in updates.
      # 
      # When registering a beacon that broadcasts Eddystone-EID, this field
      # should contain a "stable" Eddystone-UID that identifies the beacon and
      # links it to its attachments. The stable Eddystone-UID is only used for
      # administering the beacon.
    "type": "A String", # Specifies the identifier type.
        # Required.
    "id": "A String", # The actual beacon identifier, as broadcast by the beacon hardware. Must be
        # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
        # requests, and will be so encoded (with padding) in responses. The base64
        # encoding should be of the binary byte-stream and not any textual (such as
        # hex) representation thereof.
        # Required.
  },
  "beaconName": "A String", # Resource name of this beacon. A beacon name has the format
      # "beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
      # the beacon and N is a code for the beacon's type. Possible values are
      # `3` for Eddystone, `1` for iBeacon, or `5` for AltBeacon.
      # 
      # This field must be left empty when registering. After reading a beacon,
      # clients can use the name for future operations.
  "expectedStability": "A String", # Expected location stability. This is set when the beacon is registered or
      # updated, not automatically detected in any way.
      # Optional.
  "properties": { # Properties of the beacon device, for example battery type or firmware
      # version.
      # Optional.
    "a_key": "A String",
  },
  "provisioningKey": "A String", # Some beacons may require a user to provide an authorization key before
      # changing any of its configuration (e.g. broadcast frames, transmit power).
      # This field provides a place to store and control access to that key.
      # This field is populated in responses to `GET /v1beta1/beacons/3!beaconId`
      # from users with write access to the given beacon. That is to say: If the
      # user is authorized to write the beacon's confidential data in the service,
      # the service considers them authorized to configure the beacon. Note
      # that this key grants nothing on the service, only on the beacon itself.
}

  projectId: string, The project id of the project the beacon will be registered to. If
the project id is not specified then the project making the request
is used.
Optional.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Details of a beacon device.
    "status": "A String", # Current status of the beacon.
        # Required.
    "description": "A String", # Free text used to identify and describe the beacon. Maximum length 140
        # characters.
        # Optional.
    "indoorLevel": { # Indoor level, a human-readable string as returned by Google Maps APIs, # The indoor level information for this beacon, if known. As returned by the
        # Google Maps API.
        # Optional.
        # useful to indicate which floor of a building a beacon is located on.
      "name": "A String", # The name of this level.
    },
    "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The location of the beacon, expressed as a latitude and longitude pair.
        # This location is given when the beacon is registered or updated. It does
        # not necessarily indicate the actual current location of the beacon.
        # Optional.
        # of doubles representing degrees latitude and degrees longitude. Unless
        # specified otherwise, this must conform to the
        # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
        # standard</a>. Values must be within normalized ranges.
        #
        # Example of normalization code in Python:
        #
        #     def NormalizeLongitude(longitude):
        #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
        #       q, r = divmod(longitude, 360.0)
        #       if r > 180.0 or (r == 180.0 and q <= -1.0):
        #         return r - 360.0
        #       return r
        #
        #     def NormalizeLatLng(latitude, longitude):
        #       """Wraps decimal degrees latitude and longitude to
        #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
        #       r = latitude % 360.0
        #       if r <= 90.0:
        #         return r, NormalizeLongitude(longitude)
        #       elif r >= 270.0:
        #         return r - 360, NormalizeLongitude(longitude)
        #       else:
        #         return 180 - r, NormalizeLongitude(longitude + 180.0)
        #
        #     assert 180.0 == NormalizeLongitude(180.0)
        #     assert -180.0 == NormalizeLongitude(-180.0)
        #     assert -179.0 == NormalizeLongitude(181.0)
        #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
        #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
        #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
        #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
        #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
        #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
        #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
        #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
        #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
        #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
      "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
      "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
    },
    "placeId": "A String", # The [Google Places API](/places/place-id) Place ID of the place where
        # the beacon is deployed. This is given when the beacon is registered or
        # updated, not automatically detected in any way.
        # Optional.
    "ephemeralIdRegistration": { # Write-only registration parameters for beacons using Eddystone-EID format. # Write-only registration parameters for beacons using Eddystone-EID
        # (remotely resolved ephemeral ID) format. This information will not be
        # populated in API responses. When submitting this data, the `advertised_id`
        # field must contain an ID of type Eddystone-UID. Any other ID type will
        # result in an error.
        # Two ways of securely registering an Eddystone-EID beacon with the service
        # are supported:
        #
        # 1. Perform an ECDH key exchange via this API, including a previous call
        #    to `GET /v1beta1/eidparams`. In this case the fields
        #    `beacon_ecdh_public_key` and `service_ecdh_public_key` should be
        #    populated and `beacon_identity_key` should not be populated. This
        #    method ensures that only the two parties in the ECDH key exchange can
        #    compute the identity key, which becomes a secret between them.
        # 2. Derive or obtain the beacon's identity key via other secure means
        #    (perhaps an ECDH key exchange between the beacon and a mobile device
        #    or any other secure method), and then submit the resulting identity key
        #    to the service. In this case `beacon_identity_key` field should be
        #    populated, and neither of `beacon_ecdh_public_key` nor
        #    `service_ecdh_public_key` fields should be. The security of this method
        #    depends on how securely the parties involved (in particular the
        #    bluetooth client) handle the identity key, and obviously on how
        #    securely the identity key was generated.
        #
        # See [the Eddystone specification](https://github.com/google/eddystone/tree/master/eddystone-eid) at GitHub.
      "rotationPeriodExponent": 42, # Indicates the nominal period between each rotation of the beacon's
          # ephemeral ID. "Nominal" because the beacon should randomize the
          # actual interval. See [the spec at github](https://github.com/google/eddystone/tree/master/eddystone-eid)
          # for details. This value corresponds to a power-of-two scaler on the
          # beacon's clock: when the scaler value is K, the beacon will begin
          # broadcasting a new ephemeral ID on average every 2^K seconds.
      "initialClockValue": "A String", # The initial clock value of the beacon. The beacon's clock must have
          # begun counting at this value immediately prior to transmitting this
          # value to the resolving service. Significant delay in transmitting this
          # value to the service risks registration or resolution failures. If a
          # value is not provided, the default is zero.
      "serviceEcdhPublicKey": "A String", # The service's public key used for the Elliptic curve Diffie-Hellman
          # key exchange. When this field is populated, `beacon_ecdh_public_key`
          # must also be populated, and `beacon_identity_key` must not be.
      "initialEid": "A String", # An initial ephemeral ID calculated using the clock value submitted as
          # `initial_clock_value`, and the secret key generated by the
          # Diffie-Hellman key exchange using `service_ecdh_public_key` and
          # `service_ecdh_public_key`. This initial EID value will be used by the
          # service to confirm that the key exchange process was successful.
      "beaconEcdhPublicKey": "A String", # The beacon's public key used for the Elliptic curve Diffie-Hellman
          # key exchange. When this field is populated, `service_ecdh_public_key`
          # must also be populated, and `beacon_identity_key` must not be.
      "beaconIdentityKey": "A String", # The private key of the beacon. If this field is populated,
          # `beacon_ecdh_public_key` and `service_ecdh_public_key` must not be
          # populated.
    },
    "advertisedId": { # Defines a unique identifier of a beacon as broadcast by the device. # The identifier of a beacon as advertised by it. This field must be
        # populated when registering. It may be empty when updating a beacon
        # record because it is ignored in updates.
        #
        # When registering a beacon that broadcasts Eddystone-EID, this field
        # should contain a "stable" Eddystone-UID that identifies the beacon and
        # links it to its attachments. The stable Eddystone-UID is only used for
        # administering the beacon.
      "type": "A String", # Specifies the identifier type.
          # Required.
      "id": "A String", # The actual beacon identifier, as broadcast by the beacon hardware. Must be
          # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
          # requests, and will be so encoded (with padding) in responses. The base64
          # encoding should be of the binary byte-stream and not any textual (such as
          # hex) representation thereof.
          # Required.
    },
    "beaconName": "A String", # Resource name of this beacon. A beacon name has the format
        # "beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
        # the beacon and N is a code for the beacon's type. Possible values are
        # `3` for Eddystone, `1` for iBeacon, or `5` for AltBeacon.
        #
        # This field must be left empty when registering. After reading a beacon,
        # clients can use the name for future operations.
    "expectedStability": "A String", # Expected location stability. This is set when the beacon is registered or
        # updated, not automatically detected in any way.
        # Optional.
    "properties": { # Properties of the beacon device, for example battery type or firmware
        # version.
        # Optional.
      "a_key": "A String",
    },
    "provisioningKey": "A String", # Some beacons may require a user to provide an authorization key before
        # changing any of its configuration (e.g. broadcast frames, transmit power).
        # This field provides a place to store and control access to that key.
        # This field is populated in responses to `GET /v1beta1/beacons/3!beaconId`
        # from users with write access to the given beacon. That is to say: If the
        # user is authorized to write the beacon's confidential data in the service,
        # the service considers them authorized to configure the beacon. Note
        # that this key grants nothing on the service, only on the beacon itself.
  }</pre>
</div>

<div class="method">
    <code class="details" id="update">update(beaconName, body, projectId=None, x__xgafv=None)</code>
  <pre>Updates the information about the specified beacon. **Any field that you do
not populate in the submitted beacon will be permanently erased**, so you
should follow the "read, modify, write" pattern to avoid inadvertently
destroying data.

Changes to the beacon status via this method will be  silently ignored.
To update beacon status, use the separate methods on this API for
activation, deactivation, and decommissioning.
Authenticate using an [OAuth access token](https://developers.google.com/identity/protocols/OAuth2)
from a signed-in user with **Is owner** or **Can edit** permissions in the
Google Developers Console project.

Args:
  beaconName: string, Resource name of this beacon. A beacon name has the format
"beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
the beacon and N is a code for the beacon's type. Possible values are
`3` for Eddystone, `1` for iBeacon, or `5` for AltBeacon.

This field must be left empty when registering. After reading a beacon,
clients can use the name for future operations. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # Details of a beacon device.
  "status": "A String", # Current status of the beacon.
      # Required.
  "description": "A String", # Free text used to identify and describe the beacon. Maximum length 140
      # characters.
      # Optional.
  "indoorLevel": { # Indoor level, a human-readable string as returned by Google Maps APIs, # The indoor level information for this beacon, if known. As returned by the
      # Google Maps API.
      # Optional.
      # useful to indicate which floor of a building a beacon is located on.
    "name": "A String", # The name of this level.
  },
  "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The location of the beacon, expressed as a latitude and longitude pair.
      # This location is given when the beacon is registered or updated. It does
      # not necessarily indicate the actual current location of the beacon.
      # Optional.
      # of doubles representing degrees latitude and degrees longitude. Unless
      # specified otherwise, this must conform to the
      # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
      # standard</a>. Values must be within normalized ranges.
      #
      # Example of normalization code in Python:
      #
      #     def NormalizeLongitude(longitude):
      #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
      #       q, r = divmod(longitude, 360.0)
      #       if r > 180.0 or (r == 180.0 and q <= -1.0):
      #         return r - 360.0
      #       return r
      #
      #     def NormalizeLatLng(latitude, longitude):
      #       """Wraps decimal degrees latitude and longitude to
      #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
      #       r = latitude % 360.0
      #       if r <= 90.0:
      #         return r, NormalizeLongitude(longitude)
      #       elif r >= 270.0:
      #         return r - 360, NormalizeLongitude(longitude)
      #       else:
      #         return 180 - r, NormalizeLongitude(longitude + 180.0)
      #
      #     assert 180.0 == NormalizeLongitude(180.0)
      #     assert -180.0 == NormalizeLongitude(-180.0)
      #     assert -179.0 == NormalizeLongitude(181.0)
      #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
      #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
      #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
      #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
      #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
      #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
      #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
      #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
      #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
      #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
    "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
    "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
  },
  "placeId": "A String", # The [Google Places API](/places/place-id) Place ID of the place where
      # the beacon is deployed. This is given when the beacon is registered or
      # updated, not automatically detected in any way.
      # Optional.
  "ephemeralIdRegistration": { # Write-only registration parameters for beacons using Eddystone-EID format. # Write-only registration parameters for beacons using Eddystone-EID
      # (remotely resolved ephemeral ID) format. This information will not be
      # populated in API responses. When submitting this data, the `advertised_id`
      # field must contain an ID of type Eddystone-UID. Any other ID type will
      # result in an error.
      # Two ways of securely registering an Eddystone-EID beacon with the service
      # are supported:
      #
      # 1. Perform an ECDH key exchange via this API, including a previous call
      #    to `GET /v1beta1/eidparams`. In this case the fields
      #    `beacon_ecdh_public_key` and `service_ecdh_public_key` should be
      #    populated and `beacon_identity_key` should not be populated. This
      #    method ensures that only the two parties in the ECDH key exchange can
      #    compute the identity key, which becomes a secret between them.
      # 2. Derive or obtain the beacon's identity key via other secure means
      #    (perhaps an ECDH key exchange between the beacon and a mobile device
      #    or any other secure method), and then submit the resulting identity key
      #    to the service. In this case `beacon_identity_key` field should be
      #    populated, and neither of `beacon_ecdh_public_key` nor
      #    `service_ecdh_public_key` fields should be. The security of this method
      #    depends on how securely the parties involved (in particular the
      #    bluetooth client) handle the identity key, and obviously on how
      #    securely the identity key was generated.
      #
      # See [the Eddystone specification](https://github.com/google/eddystone/tree/master/eddystone-eid) at GitHub.
    "rotationPeriodExponent": 42, # Indicates the nominal period between each rotation of the beacon's
        # ephemeral ID. "Nominal" because the beacon should randomize the
        # actual interval. See [the spec at github](https://github.com/google/eddystone/tree/master/eddystone-eid)
        # for details. This value corresponds to a power-of-two scaler on the
        # beacon's clock: when the scaler value is K, the beacon will begin
        # broadcasting a new ephemeral ID on average every 2^K seconds.
    "initialClockValue": "A String", # The initial clock value of the beacon. The beacon's clock must have
        # begun counting at this value immediately prior to transmitting this
        # value to the resolving service. Significant delay in transmitting this
        # value to the service risks registration or resolution failures. If a
        # value is not provided, the default is zero.
    "serviceEcdhPublicKey": "A String", # The service's public key used for the Elliptic curve Diffie-Hellman
        # key exchange. When this field is populated, `beacon_ecdh_public_key`
        # must also be populated, and `beacon_identity_key` must not be.
    "initialEid": "A String", # An initial ephemeral ID calculated using the clock value submitted as
        # `initial_clock_value`, and the secret key generated by the
        # Diffie-Hellman key exchange using `service_ecdh_public_key` and
        # `service_ecdh_public_key`. This initial EID value will be used by the
        # service to confirm that the key exchange process was successful.
    "beaconEcdhPublicKey": "A String", # The beacon's public key used for the Elliptic curve Diffie-Hellman
        # key exchange. When this field is populated, `service_ecdh_public_key`
        # must also be populated, and `beacon_identity_key` must not be.
    "beaconIdentityKey": "A String", # The private key of the beacon. If this field is populated,
        # `beacon_ecdh_public_key` and `service_ecdh_public_key` must not be
        # populated.
  },
  "advertisedId": { # Defines a unique identifier of a beacon as broadcast by the device. # The identifier of a beacon as advertised by it. This field must be
      # populated when registering. It may be empty when updating a beacon
      # record because it is ignored in updates.
      # 
      # When registering a beacon that broadcasts Eddystone-EID, this field
      # should contain a "stable" Eddystone-UID that identifies the beacon and
      # links it to its attachments. The stable Eddystone-UID is only used for
      # administering the beacon.
    "type": "A String", # Specifies the identifier type.
        # Required.
    "id": "A String", # The actual beacon identifier, as broadcast by the beacon hardware. Must be
        # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
        # requests, and will be so encoded (with padding) in responses. The base64
        # encoding should be of the binary byte-stream and not any textual (such as
        # hex) representation thereof.
        # Required.
  },
  "beaconName": "A String", # Resource name of this beacon. A beacon name has the format
      # "beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
      # the beacon and N is a code for the beacon's type. Possible values are
      # `3` for Eddystone, `1` for iBeacon, or `5` for AltBeacon.
      # 
      # This field must be left empty when registering. After reading a beacon,
      # clients can use the name for future operations.
  "expectedStability": "A String", # Expected location stability. This is set when the beacon is registered or
      # updated, not automatically detected in any way.
      # Optional.
  "properties": { # Properties of the beacon device, for example battery type or firmware
      # version.
      # Optional.
    "a_key": "A String",
  },
  "provisioningKey": "A String", # Some beacons may require a user to provide an authorization key before
      # changing any of its configuration (e.g. broadcast frames, transmit power).
      # This field provides a place to store and control access to that key.
      # This field is populated in responses to `GET /v1beta1/beacons/3!beaconId`
      # from users with write access to the given beacon. That is to say: If the
      # user is authorized to write the beacon's confidential data in the service,
      # the service considers them authorized to configure the beacon. Note
      # that this key grants nothing on the service, only on the beacon itself.
}

  projectId: string, The project id of the beacon to update. If the project id is not
specified then the project making the request is used. The project id
must match the project that owns the beacon.
Optional.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Details of a beacon device.
    "status": "A String", # Current status of the beacon.
        # Required.
    "description": "A String", # Free text used to identify and describe the beacon. Maximum length 140
        # characters.
        # Optional.
    "indoorLevel": { # Indoor level, a human-readable string as returned by Google Maps APIs, # The indoor level information for this beacon, if known. As returned by the
        # Google Maps API.
        # Optional.
        # useful to indicate which floor of a building a beacon is located on.
      "name": "A String", # The name of this level.
    },
    "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The location of the beacon, expressed as a latitude and longitude pair.
        # This location is given when the beacon is registered or updated. It does
        # not necessarily indicate the actual current location of the beacon.
        # Optional.
        # of doubles representing degrees latitude and degrees longitude. Unless
        # specified otherwise, this must conform to the
        # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
        # standard</a>. Values must be within normalized ranges.
        #
        # Example of normalization code in Python:
        #
        #     def NormalizeLongitude(longitude):
        #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
        #       q, r = divmod(longitude, 360.0)
        #       if r > 180.0 or (r == 180.0 and q <= -1.0):
        #         return r - 360.0
        #       return r
        #
        #     def NormalizeLatLng(latitude, longitude):
        #       """Wraps decimal degrees latitude and longitude to
        #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
        #       r = latitude % 360.0
        #       if r <= 90.0:
        #         return r, NormalizeLongitude(longitude)
        #       elif r >= 270.0:
        #         return r - 360, NormalizeLongitude(longitude)
        #       else:
        #         return 180 - r, NormalizeLongitude(longitude + 180.0)
        #
        #     assert 180.0 == NormalizeLongitude(180.0)
        #     assert -180.0 == NormalizeLongitude(-180.0)
        #     assert -179.0 == NormalizeLongitude(181.0)
        #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
        #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
        #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
        #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
        #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
        #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
        #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
        #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
        #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
        #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
      "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
      "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
    },
    "placeId": "A String", # The [Google Places API](/places/place-id) Place ID of the place where
        # the beacon is deployed. This is given when the beacon is registered or
        # updated, not automatically detected in any way.
        # Optional.
    "ephemeralIdRegistration": { # Write-only registration parameters for beacons using Eddystone-EID format. # Write-only registration parameters for beacons using Eddystone-EID
        # (remotely resolved ephemeral ID) format. This information will not be
        # populated in API responses. When submitting this data, the `advertised_id`
        # field must contain an ID of type Eddystone-UID. Any other ID type will
        # result in an error.
        # Two ways of securely registering an Eddystone-EID beacon with the service
        # are supported:
        #
        # 1. Perform an ECDH key exchange via this API, including a previous call
        #    to `GET /v1beta1/eidparams`. In this case the fields
        #    `beacon_ecdh_public_key` and `service_ecdh_public_key` should be
        #    populated and `beacon_identity_key` should not be populated. This
        #    method ensures that only the two parties in the ECDH key exchange can
        #    compute the identity key, which becomes a secret between them.
        # 2. Derive or obtain the beacon's identity key via other secure means
        #    (perhaps an ECDH key exchange between the beacon and a mobile device
        #    or any other secure method), and then submit the resulting identity key
        #    to the service. In this case `beacon_identity_key` field should be
        #    populated, and neither of `beacon_ecdh_public_key` nor
        #    `service_ecdh_public_key` fields should be. The security of this method
        #    depends on how securely the parties involved (in particular the
        #    bluetooth client) handle the identity key, and obviously on how
        #    securely the identity key was generated.
        #
        # See [the Eddystone specification](https://github.com/google/eddystone/tree/master/eddystone-eid) at GitHub.
      "rotationPeriodExponent": 42, # Indicates the nominal period between each rotation of the beacon's
          # ephemeral ID. "Nominal" because the beacon should randomize the
          # actual interval. See [the spec at github](https://github.com/google/eddystone/tree/master/eddystone-eid)
          # for details. This value corresponds to a power-of-two scaler on the
          # beacon's clock: when the scaler value is K, the beacon will begin
          # broadcasting a new ephemeral ID on average every 2^K seconds.
      "initialClockValue": "A String", # The initial clock value of the beacon. The beacon's clock must have
          # begun counting at this value immediately prior to transmitting this
          # value to the resolving service. Significant delay in transmitting this
          # value to the service risks registration or resolution failures. If a
          # value is not provided, the default is zero.
      "serviceEcdhPublicKey": "A String", # The service's public key used for the Elliptic curve Diffie-Hellman
          # key exchange. When this field is populated, `beacon_ecdh_public_key`
          # must also be populated, and `beacon_identity_key` must not be.
      "initialEid": "A String", # An initial ephemeral ID calculated using the clock value submitted as
          # `initial_clock_value`, and the secret key generated by the
          # Diffie-Hellman key exchange using `service_ecdh_public_key` and
          # `service_ecdh_public_key`. This initial EID value will be used by the
          # service to confirm that the key exchange process was successful.
      "beaconEcdhPublicKey": "A String", # The beacon's public key used for the Elliptic curve Diffie-Hellman
          # key exchange. When this field is populated, `service_ecdh_public_key`
          # must also be populated, and `beacon_identity_key` must not be.
      "beaconIdentityKey": "A String", # The private key of the beacon. If this field is populated,
          # `beacon_ecdh_public_key` and `service_ecdh_public_key` must not be
          # populated.
    },
    "advertisedId": { # Defines a unique identifier of a beacon as broadcast by the device. # The identifier of a beacon as advertised by it. This field must be
        # populated when registering. It may be empty when updating a beacon
        # record because it is ignored in updates.
        #
        # When registering a beacon that broadcasts Eddystone-EID, this field
        # should contain a "stable" Eddystone-UID that identifies the beacon and
        # links it to its attachments. The stable Eddystone-UID is only used for
        # administering the beacon.
      "type": "A String", # Specifies the identifier type.
          # Required.
      "id": "A String", # The actual beacon identifier, as broadcast by the beacon hardware. Must be
          # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
          # requests, and will be so encoded (with padding) in responses. The base64
          # encoding should be of the binary byte-stream and not any textual (such as
          # hex) representation thereof.
          # Required.
    },
    "beaconName": "A String", # Resource name of this beacon. A beacon name has the format
        # "beacons/N!beaconId" where the beaconId is the base16 ID broadcast by
        # the beacon and N is a code for the beacon's type. Possible values are
        # `3` for Eddystone, `1` for iBeacon, or `5` for AltBeacon.
        #
        # This field must be left empty when registering. After reading a beacon,
        # clients can use the name for future operations.
    "expectedStability": "A String", # Expected location stability. This is set when the beacon is registered or
        # updated, not automatically detected in any way.
        # Optional.
    "properties": { # Properties of the beacon device, for example battery type or firmware
        # version.
        # Optional.
      "a_key": "A String",
    },
    "provisioningKey": "A String", # Some beacons may require a user to provide an authorization key before
        # changing any of its configuration (e.g. broadcast frames, transmit power).
        # This field provides a place to store and control access to that key.
        # This field is populated in responses to `GET /v1beta1/beacons/3!beaconId`
        # from users with write access to the given beacon. That is to say: If the
        # user is authorized to write the beacon's confidential data in the service,
        # the service considers them authorized to configure the beacon. Note
        # that this key grants nothing on the service, only on the beacon itself.
  }</pre>
</div>

</body></html>