> ## Documentation Index
> Fetch the complete documentation index at: https://usenaive.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Announce Device

> A booting Tower announces its claim code, public key, and device-token hash.

Called by a Tower on first boot (by the `device-agent firstboot` subcommand). The
box announces its claim code, its X25519 public key (used to seal inbound
payloads to the box), and a hash of its device token. Unauthenticated — the claim
code is the shared secret. Idempotent: a second announce with the same claim code
returns `200` instead of `201`.

### Request Body

| Parameter           | Type   | Required | Description                                      |
| ------------------- | ------ | -------- | ------------------------------------------------ |
| `claim_code`        | string | Yes      | The short claim code printed/shown at first boot |
| `device_pubkey`     | string | Yes      | The device's X25519 public key (base64)          |
| `device_token_hash` | string | Yes      | SHA-256 hash of the device token                 |
| `name`              | string | No       | A friendly device name                           |

<RequestExample>
  ```bash theme={"theme":"css-variables"}
  curl -X POST https://api.usenaive.ai/v1/devices/announce \
    -H "Content-Type: application/json" \
    -d '{
      "claim_code": "TWR-4F2A-9CD1",
      "device_pubkey": "MCowBQYDK2VuAyEA...",
      "device_token_hash": "9f86d081884c7d65...",
      "name": "front-office-tower"
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json 201 theme={"theme":"css-variables"}
  {
    "device_id": "dev_01H...",
    "status": "unclaimed"
  }
  ```
</ResponseExample>

<Note>
  Self-hosted only. In the cloud this route is inert. After announcing, the device
  polls [`GET /v1/devices/claim/{code}`](/docs/api-reference/devices/claim) until an
  owner claims it. See [claim & provisioning](/docs/self-hosting/claim-and-provisioning).
</Note>
