---
title: "List volumes and their coverage"
method: GET
path: "/api/recovery/storage"
tags: ["Recovery"]
---

# List volumes and their coverage

`GET /api/recovery/storage`

## Request

- Base URL: `https://localhost:1852`
- URL: `https://localhost:1852/api/recovery/storage`
- Auth: HTTP bearer

With `?stack=`, returns the volumes that stack's rendered model declares. Without
it, considers every volume on the node. Each root carries its eligibility, its
coverage reason, and the covering point when there is one. A root the caller may
not read appears as `{"access": "inaccessible"}` with its name withheld, and it
still counts against the verdict. A volume recreated since its last capture reads
`older_generation` at once, from Docker's creation time, without waiting for a new capture.

## Query parameters

- `stack` string

## Headers

- `x-node-id` integer

## Response `200`

Roots, the aggregate verdict, and this node's volume-protection capability.

- object
  - `roots` RecoveryStorageRoot[], required
    - `volumeName` string
    - `storageId` string, nullable
    - `eligible` boolean
    - `ineligibleReason` 'volume_missing' | 'reserved_name' | 'repository_volume' | 'sencho_volume' | 'anonymous_volume' | 'non_local_driver' | 'driver_options' | 'null', nullable
    - `reason` string, nullable: The sentence shown for a refused volume.
    - `coverage` 'covered' | 'no_point' | 'in_progress' | 'completion_unknown' | 'stale' | 'partial_point' | 'failed_only' | 'unverified' | 'integrity_mismatch' | 'older_generation' | 'unsupported' | 'inaccessible' | 'identity_unknown' | 'evidence_inconsistent'
    - `coveringPointId` string, nullable
    - `access` 'inaccessible'
  - `verdict` RecoveryCoverageVerdict, required
    - `state` 'protected' | 'partially_protected' | 'unprotected' | 'unknown', required
    - `reason` 'all_roots_covered' | 'some_roots_covered' | 'no_root_covered' | 'capability_unavailable' | 'capability_update_required' | 'capability_unknown' | 'no_qualifying_storage' | 'root_evidence_unknown', required
    - `roots` RecoveryRootCoverage[], required
      - `storageKey` string, nullable, required
      - `reason` 'covered' | 'no_point' | 'in_progress' | 'completion_unknown' | 'stale' | 'partial_point' | 'failed_only' | 'unverified' | 'integrity_mismatch' | 'older_generation' | 'unsupported' | 'inaccessible' | 'identity_unknown' | 'evidence_inconsistent', required
      - `coveringPointId` string, nullable, required
  - `capability` RecoveryVolumeProtection, required: Whether a node can create and restore volume recovery points, and why not. A node reports `available` or `unavailable` about itself; `update_required` and `unknown` are the control instance's conclusions about a remote node.
    - `capability` string, required
    - `version` integer, required
    - `state` 'available' | 'unavailable' | 'update_required' | 'unknown', required
    - `reason` string, required: `engine_registered` when available. When unavailable: `engine_not_installed`, `schema_newer_than_build`, `recovery_store_unavailable`, `engine_starting`, `helper_unavailable`, `repository_not_initialized`, `repository_unavailable`, `repository_key_unavailable`. When update_required: `node_contract_older` or `hub_contract_older`. When unknown: `node_unreachable`, `node_refused`, `node_error`, `descriptor_invalid`, `descriptor_mismatch`.

## Other responses

- `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`.
- `409`: A live lock is held, an interrupted operation left a stale lock, the storage identity is unknown, a check found a mismatch, an operation was interrupted, or a remote node needs an update.
- `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/storage/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)
