---
title: "POST /config/import"
method: POST
path: "/config/import"
tags: ["config"]
---

# POST /config/import

`POST /config/import`

Validate a bundle and stage it for the next restart to apply on boot.
Applying on the next boot replaces whatever configuration the target
currently holds — there is no uninitialized precondition. `confirmed` must be
`true` (the import is a device-identity move that overwrites in place); a
missing/invalid body or `confirmed != true` is a 400. D14: session-JWT
gated; the handler MUST NOT log the request body.

## Request body

- ImportConfigRequest — Request body for `POST /config/import`. `confirmed` is a deliberate gate: the import is a device-identity move, so the caller must explicitly confirm. The handler MUST never log this body.
  - `confirmed` boolean, required
  - `password` string, required
  - `sourcePath` string, required

## Response `200`

Bundle staged for next restart

- ImportConfigEnvelope — 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` ImportConfigResponse, required — Response payload for `POST /config/import` on success (staged for the next restart to apply on boot).
    - `stagedOk` boolean, required — Always `true` on success: the bundle was validated and staged.
    - `unlockRequiredAfterApply` boolean, required — `true` when applying the staged migration will require the operator to re-enter their passphrase to unlock after restart; `false` when the staged material is sufficient to unlock without further input.
  - `ts` integer, required — Server time when the response was built (unix epoch milliseconds).

## Other responses

- `400` — Confirmation missing/false, or invalid password / corrupt bundle
- `422` — Incompatible bundle
- `500` — Internal server error

---

[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/10dd20bcf330/schema)
