---
title: "Read a recovery operation"
method: GET
path: "/api/recovery/operations/{id}"
tags: ["Recovery"]
---

# Read a recovery operation

`GET /api/recovery/operations/{id}`

## Request

- Base URL: `https://localhost:1852`
- URL: `https://localhost:1852/api/recovery/operations/{id}`
- Auth: HTTP bearer

Returns the operation with its bounded progress and the evidence it produced.
`result` depends on the kind: `{point}` for a capture, `{point, verifications}`
for a verification, `{intent}` for a restore, and `{repository}` for a repository
provisioning. An unknown id answers 403, not 400, to a caller who cannot read every
kind of operation, so the answer does not reveal which ids exist.

## Path parameters

- `id` string, required

## Headers

- `x-node-id` integer

## Response `200`

The operation, its progress, and its result.

- object
  - `operation` RecoveryOperation, required
    - `id` string, uuid, required
    - `idempotencyKey` string, required: Caller-supplied key. A replay of the same key answers the same operation.
    - `kind` 'create_point' | 'verify_point' | 'restore' | 'repository_init', required
    - `storageId` string, nullable, required
    - `pointId` string, nullable, required
    - `actor` string, required
    - `transport` 'local' | 'node_proxy' | 'pilot_tunnel', required
    - `state` 'queued' | 'running' | 'succeeded' | 'partial' | 'failed' | 'cancelled' | 'completion_unknown', required: `completion_unknown` means the process was lost mid-operation. It is never success and is never retried silently.
    - `errorClass` 'invalid_request' | 'permission_denied' | 'capability_unavailable' | 'update_required' | 'schema_unsupported' | 'identity_unknown' | 'lock_held' | 'lock_stale' | 'repository_unavailable' | 'repository_key_unavailable' | 'source_unreadable' | 'integrity_mismatch' | 'attributes_not_restored' | 'interrupted' | 'transport_unreachable' | 'node_refused' | 'node_error' | 'internal' | 'null', nullable, required
    - `errorDetail` string, nullable, required
    - `processEpoch` string, required
    - `createdAt` integer, required
    - `updatedAt` integer, required
    - `completedAt` integer, nullable, required
  - `progress` RecoveryProgress, required: Bounded progress while an operation runs. Null once it settles.
    - `operationId` string, required
    - `phase` 'preparing' | 'scanning' | 'transferring' | 'verifying' | 'finalizing', required
    - `filesDone` integer, required
    - `bytesDone` integer, required
    - `bytesTotal` integer, nullable, required: Null when the engine cannot estimate a total.
  - `result` object, nullable, required: Evidence for the operation kind.

## Other responses

- `400`: The request is not valid for this storage.
- `401`: Authentication required. Provide a valid Bearer token.
- `403`: The caller lacks the access this recovery action needs. An API token whose scope does not allow the call is refused before the route runs, with `code: SCOPE_DENIED` and no `errorClass`.
- `500`: The recovery operation failed.

## Changes

- **2026-11-02** `1f7572eb735f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/studio-saelix/apis/sencho-api/changes/api/recovery/operations/:id/get.md)

---

[API](https://skmtc.dev/studio-saelix/apis/sencho-api.md) - [All operations](https://skmtc.dev/studio-saelix/apis/sencho-api/llms.txt) - [OpenAPI document](https://skmtc.dev/studio-saelix/apis/sencho-api/revisions/bb1a37e1ed3b?raw)
