---
title: "GET /clipboard/entries/:id/outbound/:device_id"
method: GET
path: "/clipboard/entries/{id}/outbound/{device_id}"
tags: ["clipboard"]
---

# GET /clipboard/entries/:id/outbound/:device_id

`GET /clipboard/entries/{id}/outbound/{device_id}`

## Request

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

Full sender-side snapshot for one (entry, target device) pair, or `null`
when the Engine holds no outbound task for it.

## Path parameters

- `id` string, required
- `device_id` string, required

## Response `200`

Current outbound snapshot or null

- OutboundProgressEnvelope: 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` OutboundProgressResponse: Full outbound snapshot for one (entry, target device) pair.
    - `attemptId` string, nullable: Current attempt; `None` when no attempt is known.
    - `entryId` string, required
    - `freshness` string, required: `waiting` | `live` | `unconfirmed` | `settled`.
    - `freshnessAvailable` boolean, required: `false` when the Engine has no freshness evidence (for example after a restart).
    - `items` OutboundProgressItemDto[]
      - `cancellationReason` string, nullable
      - `completedBytes` integer, nullable: `None` means unknown, not zero. Reaching `total_bytes` does not imply completion.
      - `failureReason` string, nullable
      - `index` integer, required
      - `kind` string, required: `file` | `representation` | `directory_unit` | `unknown`.
      - `lastKnownPhase` string, nullable: Last phase observed before the item left the running states.
      - `round` integer, nullable
      - `state` string, required: `waiting` | `transferring` | `processing` | `retrying` | `completed` | `failed` | `cancelled` | `unconfirmed`.
      - `totalBytes` integer, nullable: `None` means the total is unknown, not zero.
    - `itemsCancelled` integer, required
    - `itemsCompleted` integer, required
    - `itemsFailed` integer, required
    - `itemsRunning` integer, required
    - `itemsTotal` integer, required
    - `itemsUnconfirmed` integer, required
    - `itemsWaiting` integer, required
    - `revision` integer, required: Monotonic per (entry, target); older revisions must not overwrite newer ones.
    - `state` string, required: `no_items` | `waiting` | `in_progress` | `unconfirmed` | `partially_unconfirmed` | `completed` | `failed` | `partially_failed` | `cancelled` | `partially_cancelled`.
    - `targetDeviceId` string, required
  - `ts` integer, required: Server time when the response was built (unix epoch milliseconds).

## Other responses

- `400`: Malformed request
- `500`: Internal server error
- `503`: Outbound progress is unavailable

## Changes

- **2026-10-28** `48a01cf04e4c`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/uniclipboard/apis/uniclipboard-daemon-api/changes/clipboard/entries/:id/outbound/:device_id/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)
