---
title: "PATCH /mobile-sync/settings"
method: PATCH
path: "/mobile-sync/settings"
tags: ["mobile-sync"]
---

# PATCH /mobile-sync/settings

`PATCH /mobile-sync/settings`

## Request body

- UpdateMobileSyncSettingsRequest — Request body (patch) for `PATCH /mobile-sync/settings`. `lanAdvertiseIp` / `lanPort` are three-state: field absent = leave untouched; explicit `null` = clear; value = set. The frontend's `JSON.stringify` drops `undefined` (absent) and serializes `null` explicitly. The `Option<Option<T>>` Rust type preserves the distinction; the wire type is just `T | null` optional (declared via `schema(value_type)`).
  - `enabled` boolean, nullable
  - `lanAdvertiseBaseUrl` string, nullable
  - `lanAdvertiseIp` string, nullable
  - `lanListenEnabled` boolean, nullable
  - `lanPort` integer, nullable

## Response `200`

Settings updated

- UpdateMobileSyncSettingsEnvelope — 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` UpdateMobileSyncSettingsResultDto, required — Result of updating mobile-sync settings.
    - `enabled` boolean, required
    - `lanAdvertiseBaseUrl` string, nullable
    - `lanAdvertiseIp` string, nullable
    - `lanListenEnabled` boolean, required
    - `lanListenerBindError` string, nullable — Reason the LAN listener failed to bind under the immediate-apply path (port in use, permission, unassignable IP). `None` in the CLI fallback / no-lifecycle assembly.
    - `lanPort` integer, nullable
    - `restartRequired` boolean, required — Wire-compat historical flag. In the GUI/daemon path settings take effect immediately so this is always false; the CLI fallback assembly still returns "any field actually changed → true" to express the old "next daemon restart" semantics. The frontend shows a restart banner only when true.
  - `ts` integer, required — Server time when the response was built (unix epoch milliseconds).

## Other responses

- `422` — Invalid LAN parameter
- `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)
