---
title: "List project snapshots"
method: GET
path: "/projects/v1/{project_id}/snapshots"
tags: ["Project Snapshots"]
---

# List project snapshots

`GET /projects/v1/{project_id}/snapshots`

## Request

- Base URL: `https://api.run402.com`
- URL: `https://api.run402.com/projects/v1/{project_id}/snapshots`
- Auth: one of:
  - API key in header `SIGN-IN-WITH-X`
  - HTTP bearer
  - HTTP bearer

Keyset-paginated list of project restore-point snapshots. Filter by kind with `kind=manual|pre_migration|pre_restore|scheduled`. Also accepts the project's own service key (`serviceKey`), scoped to that project: a key for another project is refused 403 for every id, and a service key plus a SIWX header is refused 400 `AUTH_CREDENTIALS_AMBIGUOUS`.

## Path parameters

- `project_id` string, required: Run402 project ID. Public IDs are not UUIDs.

## Query parameters

- `limit` integer
- `after` string
- `kind` 'manual' | 'pre_migration' | 'pre_restore' | 'scheduled'

## Response `200`

Snapshot page.

- ProjectSnapshotList
  - `snapshots` ProjectSnapshot[], required
    - `snapshot_id` string, required
    - `operation_id` string, required: Same value as snapshot_id in v1.
    - `project_id` string, required: Run402 project ID. Public IDs are not UUIDs.
    - `kind` 'manual' | 'pre_migration' | 'pre_restore' | 'scheduled', required
    - `profile` 'snapshot', required
    - `status` 'running' | 'ready' | 'failed' | 'expired', required
    - `manifest_sha256` string, nullable
    - `size_bytes` integer, required
    - `live_release_id` string, nullable
    - `captured_at` string, date-time, nullable
    - `expires_at` string, date-time, nullable
    - `error` object, nullable
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `next_actions` NextAction[], required
      - `type` string, required: Advisory machine-readable action type such as retry, authenticate, submit_payment, fund_wallet, renew_tier, check_usage, resume_deploy, edit_request, edit_migration, contact_support, upgrade_client, poll (poll the project events feed — appended when the envelope carries a correlated_platform_incident), or hand_to_member (on a commit/promote response that just activated a public site: show the human urls.site and urls.console, relay Run402's offer to promote the build on @run402com, and ask yes or no — see `credited_as` below).
      - `method` string
      - `path` string
      - `auth` string
      - `why` string
      - `credited_as` string, nullable: `hand_to_member` only. The caller's own live presence name in the project's default room, else that room's most recently active live presence, else `null` — in which case `why` tells the agent that joining the room with a name (`run402 rooms join --name ...`) is how the promotion credits it.
      - `body` object: `hand_to_member` only. A ready-to-send `POST /feedback/v1` template: `{ project_id, message: "promote: yes", handle? }`.
    - `label` string, nullable, required: Caller label, immutable. Null for platform-created snapshots.
    - `metadata` ProjectSnapshotMetadata, nullable, required: Caller metadata: a flat object of string, number, boolean or string[] values, at most 4 KB serialized (the asset-metadata rules). Immutable; never for secrets.
    - `created_by` object, required
      - `credential_kind` 'control_plane_session' | 'siwx_eoa' | 'service_key' | 'system' | 'platform', required: `platform` = an automatic capture (pre_migration, pre_restore, scheduled).
      - `principal_id` string, nullable, required: Null for a service-key or platform snapshot.
    - `restore_of` object, nullable, required: Set on a pre_restore snapshot: the restore that caused it.
      - `snapshot_id` string, required
      - `restore_id` string, required
  - `has_more` boolean, required
  - `next_cursor` string, nullable, required

---

[API](https://skmtc.dev/run402/apis/run402-api.md) · [All operations](https://skmtc.dev/run402/apis/run402-api/llms.txt) · [OpenAPI document](https://skmtc.dev/run402/apis/run402-api/revisions/893607557f50?raw)
