---
title: "POST /pairing/unpair"
method: POST
path: "/pairing/unpair"
tags: ["pairing"]
---

# POST /pairing/unpair

`POST /pairing/unpair`

Revokes the local member record for the given peer and returns the
Engine-owned workspace convergence state. Errors flow through the shared `ApiError`
carrier and therefore serialize to `ApiErrorResponse { code, message,
details? }` on the wire.

## Request body

- UnpairDeviceRequest
  - `peerId` string, required

## Response `200`

- WorkspaceConvergenceEnvelope — 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` WorkspaceConvergenceDto, required — Complete Engine-owned workspace convergence state for the active space.
    - `convergenceDigest` string, nullable
    - `divergedPeerDeviceIds` string[], required
    - `effectiveMemberCount` integer, required
    - `failureCategory` 'space_mismatch' | 'continuity_gap' | 'identity_mismatch' | 'digest_conflict' | 'unauthorized' | 'version_incompatible' | 'no_effective_members' | 'storage' — Stable failure category for workspace convergence.
    - `historyEventCount` integer, required
    - `pendingRemovalDecisionDeviceIds` string[], required
    - `pendingRemovalDecisionEventId` string, nullable
    - `phase` 'locally_applied' | 'converging' | 'complete' | 'recovery_required', required — Current phase of the Engine-owned workspace convergence.
    - `removed` boolean, required
    - `revision` integer, required
    - `updatedAtMs` integer, required
    - `upgradeRequiredPeerDeviceIds` string[], required
  - `ts` integer, required — Server time when the response was built (unix epoch milliseconds).

## Other responses

- `404` — Member not found
- `500` — Internal server error
- `503` — Runtime 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/revisions/cdaebaa4d46a/schema)
