---
title: "POST /encryption/unlock-with-passphrase"
method: POST
path: "/encryption/unlock-with-passphrase"
tags: ["encryption"]
---

# POST /encryption/unlock-with-passphrase

`POST /encryption/unlock-with-passphrase`

Unlocks the space with a user-supplied plaintext passphrase (ADR-008 D15).

Routes through the engine unlock operation, which also runs switch-space,
search, receive, clipboard gate, and deferred-service recovery. On success
the HTTP layer only broadcasts `encryption.session_ready`.

D14: this endpoint is session-JWT gated (it is NOT in `PUBLIC_PATHS`) and
the handler MUST NOT log the request body — there is intentionally no
`?req` / passphrase field on any span or tracing event here.

## Request body

- UnlockSpaceRequest — Request body for `POST /encryption/unlock-with-passphrase` (ADR-008 D15). Carries the user's plaintext passphrase over the loopback API. Per D14 the endpoint is session-JWT gated (not in `PUBLIC_PATHS`) and the handler MUST never log this body — see the rule in `uc-webserver` `api/encryption.rs`. This formally retires the historical "passphrase 不出进程" invariant: under the "same UID = trusted" model (D14) an attacker who can sniff loopback can already dump the master key from daemon memory, so loopback transport adds zero incremental exposure.
  - `passphrase` string, required

## Response `200`

Space unlocked

- UnlockSpaceEnvelope — 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` UnlockSpaceResponse, required — Response payload for `POST /encryption/unlock-with-passphrase`.
    - `spaceId` string, required
  - `ts` integer, required — Server time when the response was built (unix epoch milliseconds).

## Other responses

- `403` — Wrong passphrase
- `409` — Setup not completed / space not initialized
- `422` — Space key material corrupted
- `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/a5d29889448a/schema)
