---
title: "POST /mobile-sync/devices"
method: POST
path: "/mobile-sync/devices"
tags: ["mobile-sync"]
---

# POST /mobile-sync/devices

`POST /mobile-sync/devices`

## Request body

- RegisterMobileDeviceRequest — Request body for `POST /mobile-sync/devices`. `username` / `password` absent (missing field or explicit null) routes through the auto-mint path; a value is strictly validated.
  - `label` string, required
  - `password` string, nullable
  - `username` string, nullable

## Response `200`

Device registered (one-time password echo)

- RegisterMobileDeviceEnvelope — Canonical success envelope: `{ "data": T, "ts": <unix millis i64> }`. `ts` is `chrono::Utc::now().timestamp_millis()`, set in the webserver handler via [`ApiEnvelope::now`] (the contract carries only the type + the clock helper, not a hard dependency on when the handler reads the clock). `rename_all = "camelCase"` is a no-op for the single-word fields here but is declared for forward-compat. IMPORTANT (utoipa v4): every concrete `ApiEnvelope<X>` that needs a named OpenAPI component is declared in the `#[aliases(...)]` block below. Add a new alias line whenever a new payload type needs enveloping. NEVER register the bare `ApiEnvelope` in `components(schemas(...))` — utoipa errors on a bare generic, and an un-aliased generic inlines an anonymous schema.
  - `data` RegisterMobileDeviceResultDto, required — Result of registering an iPhone Shortcut device. `password` is the **one and only** plaintext echo to the frontend — afterwards it exists solely as a PHC hash server-side. The two QR PNGs arrive base64-encoded (encoded daemon-side) ready for `<img src="data:image/png;base64,...">`.
    - `baseUrl` string, required
    - `clientType` string, required
    - `connectUri` string, required — `uniclipboard://connect?...` deep link (the main QR content).
    - `createdAtMs` integer, required
    - `deviceId` string, required
    - `installQrCodePngBase64` string, required — Base64 PNG of the iCloud shortcut-install URL.
    - `installUrl` string, required
    - `label` string, required
    - `password` string, required
    - `qrCodeAscii` string, required — ASCII-art QR encoding `connectUri` (for terminal rendering).
    - `qrCodePngBase64` string, required — Base64 PNG encoding `connectUri`.
    - `username` string, required
  - `ts` integer, required — Server time when the response was built (unix epoch milliseconds).

## Other responses

- `409` — Username taken / LAN listener disabled
- `422` — Invalid label / username / password
- `500` — Internal server error
- `503` — Mobile sync facade unavailable

---

[API](https://skmtc.net/uniclipboard/apis/uniclipboard-daemon-api.md) · [All operations](https://skmtc.net/uniclipboard/apis/uniclipboard-daemon-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/uniclipboard/uniclipboard-daemon-api/versions/a5d29889448a/schema)
