---
title: "GET /member/device-group-choices"
method: GET
path: "/member/device-group-choices"
tags: ["member"]
---

# GET /member/device-group-choices

`GET /member/device-group-choices`

## Request

- The document declares no server URL.
- Auth: one of:
  - API key in query parameter `auth`
  - API key in header `Authorization`

## Response `200`

- DeviceGroupChoicesEnvelope: 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` DeviceGroupChoicesDto, required
    - `deviceTrust` 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
            - `migratedRecords` integer, nullable
            - `preservedUnreadableRecords` integer, nullable
            - `selfDeviceId` string, required
            - `selfIdentityFingerprint` string, required
            - `spaceId` string, required
            - `sponsorDeviceId` string, required
            - `sponsorIdentityFingerprint` string, required
          - `peerUpgradeRequired` boolean
          - `status` 'active', required
        - object
          - `cancelRequested` boolean, required
          - `joinId` string, required
          - `peerUpgradeRequired` boolean
          - `sponsorDeviceId` string, nullable
          - `sponsorIdentityFingerprint` string, nullable
          - `status` 'pending', required
          - `targetSpaceId` string, nullable
        - object
          - `joinId` string, required
          - `peerUpgradeRequired` boolean, required
          - `sponsorDeviceId` string, required
          - `sponsorIdentityFingerprint` string, required
          - `status` 'processing', required
          - `targetSpaceId` string, required
        - object
          - `joinId` string, required
          - `nextRetryAtMs` integer, nullable
          - `reason` 'outcome_cannot_be_proven', required
          - `recovery` 'preserve_data_and_contact_support', required
          - `status` 'needs_attention', required
        - object
          - `joinId` string, required
          - `reason` 'invitation_unavailable' | 'authentication_rejected' | 'identity_conflict' | 'base_history_changed' | 'joiner_history_ahead' | 'history_conflict' | 'completion_invalid' | 'membership_history_invalid' | 'security_material_invalid' | 'relationship_conflict' | 'activation_state_invalid' | 'peer_upgrade_required' | 'cancelled' | 'removed_before_activation', required
          - `status` 'rejected', required
        - object
          - `joinId` string, required
          - `reason` 'cancelled' | 'expired' | 'superseded', required
          - `status` 'terminated', 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` 'confirmation_pending' | 'consistent' | 'pending_local_decision' | 'awaiting_removal_acknowledgement' | 'diverged' | 'unverifiable' | 'unknown', required
        - `groupUpdate` DeviceGroupUpdateDto
          - `attempts` integer, required
          - `epoch` integer, required
          - `nextRetryAtMs` integer, nullable: Present only when `recovery` is `automatic`.
          - `recovery` 'automatic' | 'automatic_on_reconnect' | 'review_device', required: Whether the Engine advances the update on its own (`automatic*`) or the device needs review; host-side re-queries never change the outcome.
          - `state` 'waiting' | 'receiver_unavailable' | 'rejected_unclassified' | 'rejected_by_receiver', required: Delivery state of the oldest unacknowledged group key update for one device.
        - `isLocal` boolean, required
        - `membership` 'active' | 'removed' | 'unavailable' | 'unknown', required
        - `pairingConfirmation` 'awaiting_peer_confirmation' | 'unconfirmed' | 'confirmed'
        - `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
      - `inboundPairings` InboundPairingDto[]
        - `deviceId` string, nullable
        - `displayName` string, nullable
        - `pairingId` string, required
        - `status` 'awaiting_confirmation' | 'confirmation_missed' | 'needs_attention' | 'failed', required
      - `localDeviceId` string, required
      - `localMembership` 'active' | 'removed' | 'unavailable' | 'unknown', required
      - `maintenanceHealth` MembershipMaintenanceHealthDto
        - `nextRetryAtMs` integer, nullable
        - `phase` 'healthy' | 'retrying' | 'needs_attention', required
        - `reason` 'membership_history_rejected'
        - `recovery` 'resolve_device_trust'
      - `pendingInboundMember` PendingInboundMemberDto
        - `deviceId` string, required
        - `displayName` string, required
      - `recovery` string, required
      - `revision` integer, required
      - `spaceDeviceUpdate` SpaceDeviceUpdateStatusDto
        - `nextRetryAtMs` integer, nullable
        - `phase` 'updating' | 'completed' | 'retryable_failure' | 'needs_attention', required
        - `reason` 'device_state_rejected' | 'device_relationship_conflict' | 'device_security_update_rejected' | 'device_upgrade_required' | 'local_identity_mismatch'
        - `recovery` 'review_devices' | 'update_app'
      - `updatedAtMs` integer, required
    - `issues` DeviceGroupChoiceIssueDto[], required
      - `choices` DeviceGroupChoiceOptionDto[], required
        - `choiceId` string, required
        - `impact` DeviceGroupChoiceImpactDto
          - `localDeviceOutcome` 'active' | 'removed' | 'unavailable' | 'unknown', required
          - `pausedDeviceIds` string[], required
          - `pendingConfirmationDeviceIds` string[], required
          - `requiresRejoinDeviceIds` string[], required
          - `syncScopeDeviceIds` string[], required: Expected sync scope; not authorization or completed recovery.
        - `isCurrentGroup` boolean, required
        - `memberDeviceIds` string[], required
        - `members` DeviceGroupChoiceMemberDto[]
          - `active` boolean, required
          - `deviceId` string, required
          - `displayName` string, required
          - `isLocal` boolean, required
        - `membersComplete` boolean, required
        - `requiresRePairing` boolean, required
        - `sourceDeviceIds` string[]
      - `issueId` string, required
      - `reason` DeviceGroupChoiceReasonDto: Verified language-neutral facts. Products localize templates, not device names.
        - `changes` DeviceGroupChangeDto[], required
          - `actor` DeviceGroupChoiceDeviceDto, required
            - `deviceId` string, required
            - `displayName` string, required
          - `kind` 'added_device' | 'removed_device', required
          - `side` 'local' | 'remote', required
          - `target` DeviceGroupChoiceDeviceDto, required
            - `deviceId` string, required
            - `displayName` string, required
        - `decisions` DeviceGroupDecisionDto[], required
          - `decision` 'accepted' | 'rejected', required
          - `device` DeviceGroupChoiceDeviceDto, required
            - `deviceId` string, required
            - `displayName` string, required
          - `target` DeviceGroupChoiceDeviceDto, required
            - `deviceId` string, required
            - `displayName` string, required
        - `detailsComplete` boolean, required
        - `kind` 'unknown' | 'pending_removal' | 'different_removals' | 'removal_decision_disagreement' | 'diverged_history', required
    - `revision` integer, required
  - `ts` integer, required: Server time when the response was built (unix epoch milliseconds).

## Changes

- **2026-10-11** `27ec7216411b`: 1 info
  - added the optional property `data/deviceTrust/devices/items/groupUpdate` to the response with the `200` status
- **2026-09-26** `8f5f5347e908`: 2 warning
  - added the new `awaiting_removal_acknowledgement` enum value to the `data/deviceTrust/devices/items/groupRelationship` response property for the response status `200`
  - added the new `local_identity_mismatch` enum value to the `data/deviceTrust/spaceDeviceUpdate/reason/allOf[#/components/schemas/SpaceDeviceUpdateProblemDto]/` response property for the response status `200`
- **2026-09-21** `1fc1cc53ec12`: 1 info
  - added the optional property `data/deviceTrust/spaceDeviceUpdate` to the response with the `200` status
- **2026-09-21** `2a328320ff77`: 1 breaking, 2 info
  - added `subschema #4, subschema #5` to the `data/deviceTrust/currentJoin/allOf[#/components/schemas/JoinSpaceResponse]/` response property `oneOf` list for the response status `200`
  - added the optional property `data/deviceTrust/inboundPairings` to the response with the `200` status
  - removed `subschema #4` from the `data/deviceTrust/currentJoin/allOf[#/components/schemas/JoinSpaceResponse]/` response property `oneOf` list for the response status `200`
- …earlier changes not shown

[Operation history](https://skmtc.dev/uniclipboard/apis/uniclipboard-daemon-api/changes/member/device-group-choices/get.md)

---

[API](https://skmtc.dev/uniclipboard/apis/uniclipboard-daemon-api.md) - [All operations](https://skmtc.dev/uniclipboard/apis/uniclipboard-daemon-api/llms.txt) - [OpenAPI document](https://skmtc.dev/uniclipboard/apis/uniclipboard-daemon-api/revisions/48a01cf04e4c?raw)
