<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">Proximity Beacon API</a> . <a href="proximitybeacon_v1beta1.beacons.html">beacons</a> . <a href="proximitybeacon_v1beta1.beacons.attachments.html">attachments</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#batchDelete">batchDelete(beaconName, namespacedType=None, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes multiple attachments on a given beacon. This operation is</p>
<p class="toc_element">
  <code><a href="#create">create(beaconName, body, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Associates the given data with the specified beacon. Attachment data must</p>
<p class="toc_element">
  <code><a href="#delete">delete(attachmentName, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes the specified attachment for the given beacon. Each attachment has</p>
<p class="toc_element">
  <code><a href="#list">list(beaconName, namespacedType=None, projectId=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns the attachments for the specified beacon that match the specified</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="batchDelete">batchDelete(beaconName, namespacedType=None, projectId=None, x__xgafv=None)</code>
  <pre>Deletes multiple attachments on a given beacon. This operation is
permanent and cannot be undone.

You can optionally specify `namespacedType` to choose which attachments
should be deleted. If you do not specify `namespacedType`,  all your
attachments on the given beacon will be deleted. You also may explicitly
specify `*/*` to delete all.

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, The beacon whose attachments 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)
  namespacedType: string, Specifies the namespace and type of attachments to delete in
`namespace/type` format. Accepts `*/*` to specify
"all types in all namespaces".
Optional.
  projectId: string, The project id to delete beacon attachments under. This field can be
used when "*" is specified to mean all attachment namespaces. Projects
may have multiple attachments with multiple namespaces. If "*" is
specified and the projectId string is empty, 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:

    { # Response for a request to delete attachments.
    "numDeleted": 42, # The number of attachments that were deleted.
  }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(beaconName, body, projectId=None, x__xgafv=None)</code>
  <pre>Associates the given data with the specified beacon. Attachment data must
contain two parts:
<ul>
<li>A namespaced type.</li>
<li>The actual attachment data itself.</li>
</ul>
The namespaced type consists of two parts, the namespace and the type.
The namespace must be one of the values returned by the `namespaces`
endpoint, while the type can be a string of any characters except for the
forward slash (`/`) up to 100 characters in length.

Attachment data can be up to 1024 bytes long.

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 on which the attachment should be created. 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)
  body: object, The request body. (required)
    The object takes the form of:

{ # Project-specific data associated with a beacon.
    "maxDistanceMeters": 3.14, # The distance away from the beacon at which this attachment should be
        # delivered to a mobile app.
        # 
        # Setting this to a value greater than zero indicates that the app should
        # behave as if the beacon is "seen" when the mobile device is less than this
        # distance away from the beacon.
        # 
        # Different attachments on the same beacon can have different max distances.
        # 
        # Note that even though this value is expressed with fractional meter
        # precision, real-world behavior is likley to be much less precise than one
        # meter, due to the nature of current Bluetooth radio technology.
        # 
        # Optional. When not set or zero, the attachment should be delivered at the
        # beacon's outer limit of detection.
        # 
        # Negative values are invalid and return an error.
    "data": "A String", # An opaque data container for client-provided data. Must be
        # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
        # requests, and will be so encoded (with padding) in responses.
        # Required.
    "creationTimeMs": "A String", # The UTC time when this attachment was created, in milliseconds since the
        # UNIX epoch.
    "attachmentName": "A String", # Resource name of this attachment. Attachment names have the format:
        # <code>beacons/<var>beacon_id</var>/attachments/<var>attachment_id</var></code>.
        # Leave this empty on creation.
    "namespacedType": "A String", # Specifies what kind of attachment this is. Tells a client how to
        # interpret the `data` field. Format is <var>namespace/type</var>. Namespace
        # provides type separation between clients. Type describes the type of
        # `data`, for use by the client when parsing the `data` field.
        # Required.
  }

  projectId: string, The project id of the project the attachment will belong 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:

    { # Project-specific data associated with a beacon.
      "maxDistanceMeters": 3.14, # The distance away from the beacon at which this attachment should be
          # delivered to a mobile app.
          #
          # Setting this to a value greater than zero indicates that the app should
          # behave as if the beacon is "seen" when the mobile device is less than this
          # distance away from the beacon.
          #
          # Different attachments on the same beacon can have different max distances.
          #
          # Note that even though this value is expressed with fractional meter
          # precision, real-world behavior is likley to be much less precise than one
          # meter, due to the nature of current Bluetooth radio technology.
          #
          # Optional. When not set or zero, the attachment should be delivered at the
          # beacon's outer limit of detection.
          #
          # Negative values are invalid and return an error.
      "data": "A String", # An opaque data container for client-provided data. Must be
          # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
          # requests, and will be so encoded (with padding) in responses.
          # Required.
      "creationTimeMs": "A String", # The UTC time when this attachment was created, in milliseconds since the
          # UNIX epoch.
      "attachmentName": "A String", # Resource name of this attachment. Attachment names have the format:
          # <code>beacons/<var>beacon_id</var>/attachments/<var>attachment_id</var></code>.
          # Leave this empty on creation.
      "namespacedType": "A String", # Specifies what kind of attachment this is. Tells a client how to
          # interpret the `data` field. Format is <var>namespace/type</var>. Namespace
          # provides type separation between clients. Type describes the type of
          # `data`, for use by the client when parsing the `data` field.
          # Required.
    }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(attachmentName, projectId=None, x__xgafv=None)</code>
  <pre>Deletes the specified attachment for the given beacon. Each attachment has
a unique attachment name (`attachmentName`) which is returned when you
fetch the attachment data via this API. You specify this with the delete
request to control which attachment is removed. 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:
  attachmentName: string, The attachment name (`attachmentName`) of
the attachment to remove. For example:
`beacons/3!893737abc9/attachments/c5e937-af0-494-959-ec49d12738`. For
Eddystone-EID beacons, the beacon ID portion (`3!893737abc9`) may be the
beacon's current EID, or its "stable" Eddystone-UID.
Required. (required)
  projectId: string, The project id of the attachment 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="list">list(beaconName, namespacedType=None, projectId=None, x__xgafv=None)</code>
  <pre>Returns the attachments for the specified beacon that match the specified
namespaced-type pattern.

To control which namespaced types are returned, you add the
`namespacedType` query parameter to the request. You must either use
`*/*`, to return all attachments, or the namespace must be one of
the ones returned from the  `namespaces` endpoint.

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:
  beaconName: string, Beacon whose attachments should be fetched. 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)
  namespacedType: string, Specifies the namespace and type of attachment to include in response in
<var>namespace/type</var> format. Accepts `*/*` to specify
"all types in all namespaces".
  projectId: string, The project id to list beacon attachments under. This field can be
used when "*" is specified to mean all attachment namespaces. Projects
may have multiple attachments with multiple namespaces. If "*" is
specified and the projectId string is empty, 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:

    { # Response to `ListBeaconAttachments` that contains the requested attachments.
    "attachments": [ # The attachments that corresponded to the request params.
      { # Project-specific data associated with a beacon.
          "maxDistanceMeters": 3.14, # The distance away from the beacon at which this attachment should be
              # delivered to a mobile app.
              #
              # Setting this to a value greater than zero indicates that the app should
              # behave as if the beacon is "seen" when the mobile device is less than this
              # distance away from the beacon.
              #
              # Different attachments on the same beacon can have different max distances.
              #
              # Note that even though this value is expressed with fractional meter
              # precision, real-world behavior is likley to be much less precise than one
              # meter, due to the nature of current Bluetooth radio technology.
              #
              # Optional. When not set or zero, the attachment should be delivered at the
              # beacon's outer limit of detection.
              #
              # Negative values are invalid and return an error.
          "data": "A String", # An opaque data container for client-provided data. Must be
              # [base64](http://tools.ietf.org/html/rfc4648#section-4) encoded in HTTP
              # requests, and will be so encoded (with padding) in responses.
              # Required.
          "creationTimeMs": "A String", # The UTC time when this attachment was created, in milliseconds since the
              # UNIX epoch.
          "attachmentName": "A String", # Resource name of this attachment. Attachment names have the format:
              # <code>beacons/<var>beacon_id</var>/attachments/<var>attachment_id</var></code>.
              # Leave this empty on creation.
          "namespacedType": "A String", # Specifies what kind of attachment this is. Tells a client how to
              # interpret the `data` field. Format is <var>namespace/type</var>. Namespace
              # provides type separation between clients. Type describes the type of
              # `data`, for use by the client when parsing the `data` field.
              # Required.
        },
    ],
  }</pre>
</div>

</body></html>