---
title: "Verify Snapshot Restore-Readiness"
method: GET
path: "/v1/namespaces/{namespace_identifier}/snapshots/{snapshot_id}/verify"
tags: ["Namespace Snapshots"]
---

# Verify Snapshot Restore-Readiness

`GET /v1/namespaces/{namespace_identifier}/snapshots/{snapshot_id}/verify`

## Request

- Base URL: `https://api.mixpeek.com`
- URL: `https://api.mixpeek.com/v1/namespaces/{namespace_identifier}/snapshots/{snapshot_id}/verify`
- Auth: HTTP bearer

Read-only pre-flight check that a snapshot can actually be restored. Restore is lenient and silently skips missing artifacts, so this surfaces what a restore would drop (missing collection dumps, unreachable vectors, absent copied objects) BEFORE you depend on it in a recovery. Pass deep=true to also decompress each collection dump and detect truncation.

## Path parameters

- `namespace_identifier` string, required: Namespace name or ID
- `snapshot_id` string, required: Snapshot ID to verify (e.g. snap_xxxxxxxxxxxx)

## Query parameters

- `deep` boolean: Also decompress each collection dump to detect truncated artifacts

## Response `200`

Successful Response

- SnapshotVerifyResponse: Result of a read-only pre-flight check that a snapshot can be restored. Restore itself is LENIENT — a missing collection dump is caught and logged as a warning, so restore reports success while SILENTLY dropping data. This check surfaces exactly what restore would skip BEFORE you depend on it in a recovery, by re-validating the snapshot's object-store artifacts against the manifest it claims to hold (no materialization).
  - `snapshot_id` string, required
  - `status` string, required
  - `restorable` boolean, required: True iff there are no error-severity issues (a clean restore is possible)
  - `issues` SnapshotVerifyIssue[]
    - `code` string, required: Machine-readable issue code, e.g. 'missing_collection_dump'
    - `severity` string, required: 'error' (blocks a clean restore) or 'warning' (degraded but restorable)
    - `detail` string, required: Human-readable explanation of what restore would do/lose
  - `collections_verified` integer: Count of expected (non-empty) collection dumps found present
  - `vector_source` string, nullable: Where vectors would restore from: 'self', the shard-representative prefix (coalesced), 'none', or null if unresolved
  - `vector_capture` string: Deep-verify per-point vector NON-emptiness verdict. 'measured_ok': captured points carry non-empty vectors. 'measured_degraded': a significant fraction carry EMPTY vectors — the Raw-absence signature (a raw-less point scrolls back with vectors=[] yet counts as captured), so a restore would be searchable-degraded even though the point-count guard passed. 'could_not_measure': not deep-verified, metadata-only, or unreadable. Three-valued by design — could_not_measure must never render as ok (a boolean would collapse incapacity into the healthy value).
  - `frontier` SnapshotFrontier: Where each store stood when the snapshot was taken. Each half is read before and after its capture, so a restore knows the window the data lies in. ``consistency`` names that tier.
    - `consistency` string: 'bracketed': each store's capture lies between its recorded start and end positions
    - `mongo` MongoFrontier
      - `read_concern` string: Read concern the cluster time was read under
      - `cluster_time_start` ClusterTime
        - `t` integer, required: Mongo cluster time seconds component
        - `i` integer, required: Mongo cluster time increment component
      - `cluster_time_end` ClusterTime
        - `t` integer, required: Mongo cluster time seconds component
        - `i` integer, required: Mongo cluster time increment component
      - `error` string, nullable: Why a cluster time could not be read, when it could not
    - `vectors` VectorFrontier
      - `capture_mode` string: 'scroll_bracketed': vectors were exported by a scroll while writes continued, so the export lies between shards_start and shards_end and matches no single commit. 'not_captured': this snapshot exported no vectors.
      - `shards_start` object: Per-shard frontier read before the export
      - `shards_end` object: Per-shard frontier read after the export
      - `error` string, nullable
    - `objects` ObjectFrontier
      - `generation_cutoff` integer, nullable: Highest object generation in the recorded inventory (GCS); null on stores without generations
      - `last_modified_cutoff` string, nullable: Latest last-modified time in the recorded inventory
      - `objects_listed` integer
    - `config_yaml` string, nullable: The namespace's configuration exported as a manifest YAML, secrets replaced by placeholders
    - `config_yaml_error` string, nullable
    - `digests` object: sha256 and size of every artifact, keyed by path under the snapshot prefix
    - `schema_versions` object: Format version of the manifest and of each artifact kind
    - `secrets` SecretVersion[]: Organization secrets by name and version at snapshot time
      - `name` string, required
      - `version` string, required: Version name of the stored value at snapshot time; the value itself is never recorded
  - `mongo_backup` BackupCoverage
    - `provider` string, required: Backup binding that answered: 'pbm' or 'atlas'
    - `covered` boolean, nullable, required: True when the instant is restorable from a completed base backup plus continuous oplog; False when it is not; null when the provider could not be asked
    - `base_backup` string, nullable: Name of the base backup a restore starts from
    - `base_backup_time` integer, nullable: Cluster time seconds the base backup ends at
    - `oplog_end_time` integer, nullable: Cluster time seconds the continuous oplog reaches from the base backup
    - `reason` string, nullable: Why the instant is not covered or not known
  - `digests_verified` integer: Artifacts whose sha256 was recomputed and matched the manifest (deep verify only)
  - `last_restore` RestoreReport: Outcome of a restore: exactly what was restored vs skipped. Restore is lenient (it warns + continues on a missing/corrupt dump), so a 'completed' restore can be silently incomplete. This report records the per-collection and vector outcomes and a single ``complete`` flag so a partial restore is never mistaken for a clean one.
    - `snapshot_id` string, required
    - `target_namespace_id` string, required
    - `complete` boolean, required: True iff every non-empty collection AND the vectors were fully restored
    - `collections` RestoreCollectionOutcome[]
      - `collection` string, required
      - `expected` integer, required
      - `restored` integer, required
      - `status` string, required: 'restored' (full), 'partial' (restored < expected), 'failed', or 'skipped' (left out on purpose: a restore beside the source does not clone history, telemetry or secrets)
      - `reason` string, nullable
    - `vector_expected` integer
    - `vector_restored` integer
    - `vector_source` string, nullable
    - `vector_status` string: 'restored', 'partial', 'failed', or 'none' (snapshot carried no vectors)
    - `skipped_summary` string[]: Human-readable list of everything not fully restored (empty when complete)
    - `retriever_parity` RetrieverParityResult[]: Top-k parity per retriever between the source and the restored namespace; filled for a restore into a different namespace
      - `retriever_name` string, required
      - `status` string, required: 'match' (same ordered top-k), 'mismatch', 'skipped' (no probe input), 'missing_in_target', or 'error'
      - `reason` string, nullable
      - `probe_inputs` object, nullable
      - `source_top_k` string[]
      - `target_top_k` string[]
      - `overlap` integer, nullable: Document ids the two top-k lists share
    - `restore_point` string, nullable: The restore_point the vectors were restored to
    - `resolved_seq` integer, nullable: The WAL seq the shard's replica actually reached (frontier_seq)
    - `fork_id` string, nullable: The point-in-time replica the vectors were read from
    - `write_gap` object, nullable: For a restore beside the source: objects the source gained or changed after the snapshot's capture began, copied into the copy and re-queued for extraction (cutoff, new_since_snapshot, changed_since_snapshot, requeued, batches, refused with reasons)

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `422`: Unprocessable Entity
- `429`: Too Many Requests
- `500`: Internal Server Error
- `503`: Service Unavailable

## Changes

- **2026-10-09** `61a175e8eb9a`: 1 warning, 5 info
  - removed the optional property `detail` from the response with the `422` status
  - added the non-success response with the status `429`
  - added the non-success response with the status `503`
  - added the optional property `success` to the response with the `422` status
  - …2 more
- **2026-10-04** `38e0822db900`: 3 info
  - added the optional property `frontier/anyOf[subschema #1: SnapshotFrontier]/vectors/shards_end/additionalProperties/note` to the response with the `200` status
  - added the optional property `frontier/anyOf[subschema #1: SnapshotFrontier]/vectors/shards_start/additionalProperties/note` to the response with the `200` status
  - added the optional property `last_restore` to the response with the `200` status
- **2026-10-01** `436f07a84cc9`: 3 info
  - added the optional property `digests_verified` to the response with the `200` status
  - added the optional property `frontier` to the response with the `200` status
  - added the optional property `mongo_backup` to the response with the `200` status
- **2026-08-09** `5d4c905106b4`: 1 info
  - the endpoint scheme security `BearerAuth` was added to the API
- **2026-08-01** `6c69078922c2`: 1 info
  - added the optional property `vector_capture` to the response with the `200` status

[Operation history](https://skmtc.dev/mixpeek/apis/mixpeek-api/changes/v1/namespaces/:namespace_identifier/snapshots/:snapshot_id/verify/get.md)

---

[API](https://skmtc.dev/mixpeek/apis/mixpeek-api.md) - [All operations](https://skmtc.dev/mixpeek/apis/mixpeek-api/llms.txt) - [OpenAPI document](https://skmtc.dev/mixpeek/apis/mixpeek-api/revisions/790bc16455f6?raw)
