---
title: "POST /member/device-trust/decision"
method: POST
path: "/member/device-trust/decision"
tags: ["member"]
---

# POST /member/device-trust/decision

`POST /member/device-trust/decision`

## Request body

- DecideDeviceTrustRequestDto
  - `changeId` string, required
  - `choice` 'apply_change' | 'keep_current_device_group', required
  - `confirmLocalRemoval` boolean

## Response `200`

- DeviceTrustDecisionEnvelope — 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` union, required
    - object
      - `changeId` string, required
      - `kind` 'applied', required
      - `snapshot` DeviceTrustSnapshotDto, required
        - `allowedActions` DeviceTrustActionDto[], required
        - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
        - `currentChange` DeviceTrustChangeDto
          - `allowedChoices` DeviceTrustChoiceDto[], required
          - `applyImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `changeId` string, required
          - `includesLocalDevice` boolean, required
          - `keepCurrentImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `proposedByDeviceId` string, required
          - `targetDeviceIds` string[], required
        - `currentJoin` union — Stable outcome of a durable space admission.
          - object
            - `joinId` string, required
            - `joinedSpace` JoinedSpaceResponse, required
              - …
            - `status` 'active', required
          - object
            - `cancelRequested` boolean, required
            - `joinId` string, required
            - `sponsorDeviceId` string, nullable
            - `sponsorIdentityFingerprint` string, nullable
            - `status` 'pending', required
            - `targetSpaceId` string, nullable
          - object
            - `joinId` string, required
            - `reason` 'invitation_unavailable' | 'authentication_rejected' | 'identity_conflict' | 'base_history_changed' | 'joiner_history_ahead' | 'history_conflict' | 'peer_upgrade_required' | 'cancelled' | 'removed_before_activation', required
            - `status` 'rejected', required
        - `devices` DeviceTrustRelationshipDto[], required
          - `availableActions` DeviceTrustActionDto[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `compatibility` 'compatible' | 'upgrade_required' | 'unknown', required
          - `deviceId` string, required
          - `displayName` string, required
          - `groupRelationship` 'consistent' | 'pending_local_decision' | 'diverged' | 'unverifiable' | 'unknown', required
          - `isLocal` boolean, required
          - `membership` 'active' | 'removed' | 'unavailable' | 'unknown', required
          - `reachability` 'online' | 'offline' | 'unknown', required
          - `syncRelationship` 'usable' | 'waiting_for_local_decision' | 'paused_group_diverged' | 'paused_upgrade_required' | 'paused_unverifiable' | 'removed_local_device' | 'removed_peer_device' | 'unknown', required
        - `localDeviceId` string, required
        - `localMembership` 'active' | 'removed' | 'unavailable' | 'unknown', required
        - `pendingInboundMember` PendingInboundMemberDto
          - `deviceId` string, required
          - `displayName` string, required
        - `recovery` string, required
        - `revision` integer, required
        - `updatedAtMs` integer, required
    - object
      - `changeId` string, required
      - `kind` 'kept_current_device_group', required
      - `snapshot` DeviceTrustSnapshotDto, required
        - `allowedActions` DeviceTrustActionDto[], required
        - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
        - `currentChange` DeviceTrustChangeDto
          - `allowedChoices` DeviceTrustChoiceDto[], required
          - `applyImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `changeId` string, required
          - `includesLocalDevice` boolean, required
          - `keepCurrentImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `proposedByDeviceId` string, required
          - `targetDeviceIds` string[], required
        - `currentJoin` union — Stable outcome of a durable space admission.
          - object
            - `joinId` string, required
            - `joinedSpace` JoinedSpaceResponse, required
              - …
            - `status` 'active', required
          - object
            - `cancelRequested` boolean, required
            - `joinId` string, required
            - `sponsorDeviceId` string, nullable
            - `sponsorIdentityFingerprint` string, nullable
            - `status` 'pending', required
            - `targetSpaceId` string, nullable
          - object
            - `joinId` string, required
            - `reason` 'invitation_unavailable' | 'authentication_rejected' | 'identity_conflict' | 'base_history_changed' | 'joiner_history_ahead' | 'history_conflict' | 'peer_upgrade_required' | 'cancelled' | 'removed_before_activation', required
            - `status` 'rejected', required
        - `devices` DeviceTrustRelationshipDto[], required
          - `availableActions` DeviceTrustActionDto[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `compatibility` 'compatible' | 'upgrade_required' | 'unknown', required
          - `deviceId` string, required
          - `displayName` string, required
          - `groupRelationship` 'consistent' | 'pending_local_decision' | 'diverged' | 'unverifiable' | 'unknown', required
          - `isLocal` boolean, required
          - `membership` 'active' | 'removed' | 'unavailable' | 'unknown', required
          - `reachability` 'online' | 'offline' | 'unknown', required
          - `syncRelationship` 'usable' | 'waiting_for_local_decision' | 'paused_group_diverged' | 'paused_upgrade_required' | 'paused_unverifiable' | 'removed_local_device' | 'removed_peer_device' | 'unknown', required
        - `localDeviceId` string, required
        - `localMembership` 'active' | 'removed' | 'unavailable' | 'unknown', required
        - `pendingInboundMember` PendingInboundMemberDto
          - `deviceId` string, required
          - `displayName` string, required
        - `recovery` string, required
        - `revision` integer, required
        - `updatedAtMs` integer, required
    - object
      - `changeId` string, required
      - `completedChoice` 'apply_change' | 'keep_current_device_group', required
      - `kind` 'already_completed', required
      - `snapshot` DeviceTrustSnapshotDto, required
        - `allowedActions` DeviceTrustActionDto[], required
        - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
        - `currentChange` DeviceTrustChangeDto
          - `allowedChoices` DeviceTrustChoiceDto[], required
          - `applyImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `changeId` string, required
          - `includesLocalDevice` boolean, required
          - `keepCurrentImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `proposedByDeviceId` string, required
          - `targetDeviceIds` string[], required
        - `currentJoin` union — Stable outcome of a durable space admission.
          - object
            - `joinId` string, required
            - `joinedSpace` JoinedSpaceResponse, required
              - …
            - `status` 'active', required
          - object
            - `cancelRequested` boolean, required
            - `joinId` string, required
            - `sponsorDeviceId` string, nullable
            - `sponsorIdentityFingerprint` string, nullable
            - `status` 'pending', required
            - `targetSpaceId` string, nullable
          - object
            - `joinId` string, required
            - `reason` 'invitation_unavailable' | 'authentication_rejected' | 'identity_conflict' | 'base_history_changed' | 'joiner_history_ahead' | 'history_conflict' | 'peer_upgrade_required' | 'cancelled' | 'removed_before_activation', required
            - `status` 'rejected', required
        - `devices` DeviceTrustRelationshipDto[], required
          - `availableActions` DeviceTrustActionDto[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `compatibility` 'compatible' | 'upgrade_required' | 'unknown', required
          - `deviceId` string, required
          - `displayName` string, required
          - `groupRelationship` 'consistent' | 'pending_local_decision' | 'diverged' | 'unverifiable' | 'unknown', required
          - `isLocal` boolean, required
          - `membership` 'active' | 'removed' | 'unavailable' | 'unknown', required
          - `reachability` 'online' | 'offline' | 'unknown', required
          - `syncRelationship` 'usable' | 'waiting_for_local_decision' | 'paused_group_diverged' | 'paused_upgrade_required' | 'paused_unverifiable' | 'removed_local_device' | 'removed_peer_device' | 'unknown', required
        - `localDeviceId` string, required
        - `localMembership` 'active' | 'removed' | 'unavailable' | 'unknown', required
        - `pendingInboundMember` PendingInboundMemberDto
          - `deviceId` string, required
          - `displayName` string, required
        - `recovery` string, required
        - `revision` integer, required
        - `updatedAtMs` integer, required
    - object
      - `currentChangeId` string, nullable
      - `kind` 'state_changed', required
      - `snapshot` DeviceTrustSnapshotDto, required
        - `allowedActions` DeviceTrustActionDto[], required
        - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
        - `currentChange` DeviceTrustChangeDto
          - `allowedChoices` DeviceTrustChoiceDto[], required
          - `applyImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `changeId` string, required
          - `includesLocalDevice` boolean, required
          - `keepCurrentImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `proposedByDeviceId` string, required
          - `targetDeviceIds` string[], required
        - `currentJoin` union — Stable outcome of a durable space admission.
          - object
            - `joinId` string, required
            - `joinedSpace` JoinedSpaceResponse, required
              - …
            - `status` 'active', required
          - object
            - `cancelRequested` boolean, required
            - `joinId` string, required
            - `sponsorDeviceId` string, nullable
            - `sponsorIdentityFingerprint` string, nullable
            - `status` 'pending', required
            - `targetSpaceId` string, nullable
          - object
            - `joinId` string, required
            - `reason` 'invitation_unavailable' | 'authentication_rejected' | 'identity_conflict' | 'base_history_changed' | 'joiner_history_ahead' | 'history_conflict' | 'peer_upgrade_required' | 'cancelled' | 'removed_before_activation', required
            - `status` 'rejected', required
        - `devices` DeviceTrustRelationshipDto[], required
          - `availableActions` DeviceTrustActionDto[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `compatibility` 'compatible' | 'upgrade_required' | 'unknown', required
          - `deviceId` string, required
          - `displayName` string, required
          - `groupRelationship` 'consistent' | 'pending_local_decision' | 'diverged' | 'unverifiable' | 'unknown', required
          - `isLocal` boolean, required
          - `membership` 'active' | 'removed' | 'unavailable' | 'unknown', required
          - `reachability` 'online' | 'offline' | 'unknown', required
          - `syncRelationship` 'usable' | 'waiting_for_local_decision' | 'paused_group_diverged' | 'paused_upgrade_required' | 'paused_unverifiable' | 'removed_local_device' | 'removed_peer_device' | 'unknown', required
        - `localDeviceId` string, required
        - `localMembership` 'active' | 'removed' | 'unavailable' | 'unknown', required
        - `pendingInboundMember` PendingInboundMemberDto
          - `deviceId` string, required
          - `displayName` string, required
        - `recovery` string, required
        - `revision` integer, required
        - `updatedAtMs` integer, required
    - object
      - `changeId` string, required
      - `kind` 'local_device_confirmation_required', required
      - `snapshot` DeviceTrustSnapshotDto, required
        - `allowedActions` DeviceTrustActionDto[], required
        - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
        - `currentChange` DeviceTrustChangeDto
          - `allowedChoices` DeviceTrustChoiceDto[], required
          - `applyImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `changeId` string, required
          - `includesLocalDevice` boolean, required
          - `keepCurrentImpact` DeviceTrustImpactDto, required
            - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
            - `pausedDeviceIds` string[], required
            - `requiresRejoinDeviceIds` string[], required
            - `usableDeviceIds` string[], required
          - `proposedByDeviceId` string, required
          - `targetDeviceIds` string[], required
        - `currentJoin` union — Stable outcome of a durable space admission.
          - object
            - `joinId` string, required
            - `joinedSpace` JoinedSpaceResponse, required
              - …
            - `status` 'active', required
          - object
            - `cancelRequested` boolean, required
            - `joinId` string, required
            - `sponsorDeviceId` string, nullable
            - `sponsorIdentityFingerprint` string, nullable
            - `status` 'pending', required
            - `targetSpaceId` string, nullable
          - object
            - `joinId` string, required
            - `reason` 'invitation_unavailable' | 'authentication_rejected' | 'identity_conflict' | 'base_history_changed' | 'joiner_history_ahead' | 'history_conflict' | 'peer_upgrade_required' | 'cancelled' | 'removed_before_activation', required
            - `status` 'rejected', required
        - `devices` DeviceTrustRelationshipDto[], required
          - `availableActions` DeviceTrustActionDto[], required
          - `blockedReason` 'no_current_change' | 'change_no_longer_current' | 'local_device_confirmation_required' | 'local_device_removed' | 'recovery_not_available_in_this_version' | 'peer_upgrade_required' | 'device_facts_unverifiable' | 'engine_unavailable'
          - `compatibility` 'compatible' | 'upgrade_required' | 'unknown', required
          - `deviceId` string, required
          - `displayName` string, required
          - `groupRelationship` 'consistent' | 'pending_local_decision' | 'diverged' | 'unverifiable' | 'unknown', required
          - `isLocal` boolean, required
          - `membership` 'active' | 'removed' | 'unavailable' | 'unknown', required
          - `reachability` 'online' | 'offline' | 'unknown', required
          - `syncRelationship` 'usable' | 'waiting_for_local_decision' | 'paused_group_diverged' | 'paused_upgrade_required' | 'paused_unverifiable' | 'removed_local_device' | 'removed_peer_device' | 'unknown', required
        - `localDeviceId` string, required
        - `localMembership` 'active' | 'removed' | 'unavailable' | 'unknown', required
        - `pendingInboundMember` PendingInboundMemberDto
          - `deviceId` string, required
          - `displayName` string, required
        - `recovery` string, required
        - `revision` integer, required
        - `updatedAtMs` integer, required
  - `ts` integer, required — Server time when the response was built (unix epoch milliseconds).

---

[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/291e4c2346eb/schema)
