Add files to your Postgres branches via Neon Object Storage, our S3-compatible object store
/APIs & SDKs/Projects and branches/snapshots

Neon CLI command: snapshots

Create, list, restore, and schedule branch snapshots from the terminal

The snapshots command creates, lists, updates, deletes, and restores snapshots of your Neon branches, and manages the automatic backup schedule of a branch. A snapshot captures the state of a branch at a point in time, so you can restore it later. For background on the feature, plans, and limits, see Backup and restore.

If --project-id is omitted, the CLI resolves it from your context file, auto-selects when your account has only one project, and prompts otherwise.

Subcommands: create, delete, finalize, get, list, restore, schedule, update

neon snapshots create

Creates a snapshot from a branch. By default, it snapshots the head of the branch from your context or the project's default branch. Use --lsn or --timestamp to capture an earlier point within the branch's history window; the two options are mutually exclusive.

neon snapshots create [options]
OptionDescriptionTypeDefaultRequired
--branch, -bBranch id or name to snapshot. Defaults to the branch in your context, or the project's default branch.stringNo
--expires-atWhen the snapshot is automatically deleted (RFC 3339, e.g. 2025-12-31T23:59:59Z). Omit to keep it indefinitely.stringNo
--lsnTake the snapshot at this LSN (e.g. 0/1F3C8A0). Must fall within the branch's restore window. Mutually exclusive with --timestamp.stringNo
--nameA name for the snapshotstringNo
--timestampTake the snapshot at this point in time (RFC 3339, e.g. 2025-01-01T00:00:00Z). Must fall within the branch's restore window. Mutually exclusive with --lsn.stringNo
--project-idProject IDstringNo

Snapshot the head of a branch with a name:

neon snapshots create --branch main --name pre-migration

Snapshot a branch at a specific LSN and set an expiration:

neon snapshots create --branch main --lsn 0/1F3C8A0 --expires-at 2027-12-31T23:59:59Z

Snapshot a branch at a point in time:

neon snapshots create --branch main --timestamp 2025-01-01T00:00:00Z

Timestamps and expiration times use RFC 3339 format. --timestamp must be in the past and --expires-at in the future. Omit --expires-at to keep the snapshot until you delete it; a manual snapshot's expiration has no maximum, unlike the 35-day cap on scheduled snapshots. Snapshot names must be unique within a project.

neon snapshots list

Lists the snapshots in a project.

neon snapshots list [options]
OptionDescriptionTypeDefaultRequired
--project-idProject IDstringNo
neon snapshots list

neon snapshots get

Retrieves a snapshot by ID or name.

neon snapshots get <id> [options]
OptionDescriptionTypeDefaultRequired
--project-idProject IDstringNo
neon snapshots get snap-1234

neon snapshots update

Renames a snapshot or changes its expiration. Use --clear-expiration to keep a snapshot indefinitely; it's mutually exclusive with --expires-at.

neon snapshots update <id> [options]
OptionDescriptionTypeDefaultRequired
--clear-expirationClear the expiration so the snapshot is kept indefinitely.booleanNo
--expires-atSet when the snapshot expires (RFC 3339). Mutually exclusive with --clear-expiration.stringNo
--nameRename the snapshotstringNo
--project-idProject IDstringNo

Rename a snapshot:

neon snapshots update snap-1234 --name pre-migration

Clear a snapshot's expiration:

neon snapshots update snap-1234 --clear-expiration

neon snapshots delete

Deletes a snapshot by ID or name.

neon snapshots delete <id> [options]
OptionDescriptionTypeDefaultRequired
--project-idProject IDstringNo
neon snapshots delete snap-1234

neon snapshots restore

Restores a snapshot into a branch. By default, the restore is left un-finalized so you can inspect the restored branch first, then swap it in with snapshots finalize. Pass --finalize to move computes onto the restored branch and swap it in for the target immediately.

neon snapshots restore <id> [options]
OptionDescriptionTypeDefaultRequired
--finalizeFinalize the restore immediately: move computes onto the restored branch and swap it in for the target. Without this, the restore is left un-finalized so you can inspect it first, then run snapshots finalize <branch>.booleanfalseNo
--nameName for the newly restored branch. Auto-generated when omitted.stringNo
--target-branchBranch id or name to restore the snapshot onto. Defaults to the snapshot's source branch. Recommended when you intend to finalize (replace an existing branch).stringNo
--project-idProject IDstringNo

Restore a snapshot to a new branch:

neon snapshots restore snap-1234 --name recovered

Restore onto an existing branch un-finalized to preview, then finalize:

neon snapshots restore snap-1234 --target-branch main

Restore onto a branch and swap it in immediately:

neon snapshots restore snap-1234 --target-branch main --finalize

neon snapshots finalize

Finalizes a previewed snapshot restore, swapping the restored branch in for the target. Use this after running snapshots restore without --finalize. The argument is the ID of the restored branch that snapshots restore created, not the target branch. The restore command prints the exact finalize command to run.

neon snapshots finalize <branch> [options]
OptionDescriptionTypeDefaultRequired
--nameName to give the replaced (old) branch. Auto-generated when omitted.stringNo
--project-idProject IDstringNo
neon snapshots finalize br-summer-water-au2msxjn

The replaced (old) branch is kept under an auto-generated name unless you set one with --name.

Snapshot schedule

The snapshots schedule subcommands get and set the automatic snapshot (backup) schedule of a branch.

Subcommands: get, set

neon snapshots schedule get

Gets a branch's automatic snapshot schedule.

neon snapshots schedule get [options]
OptionDescriptionTypeDefaultRequired
--branch, -bBranch id or name. Defaults to the branch in your context, or the project's default branch.stringNo
--project-idProject IDstringNo
neon snapshots schedule get --branch main

neon snapshots schedule set

Sets a branch's automatic snapshot schedule. Build a single-entry schedule with --frequency and its companion flags, or pass a full JSON schedule with --schedule for a multi-entry schedule (this overrides the single-entry flags).

Pick one --frequency; that choice determines which of --day and --hour you must also set. The supported frequencies are:

--frequencyAlso required--day range
daily--hour (0-23)not used
weekly--day, --hour1-7 (Monday-Sunday)
monthly--day, --hour1-31

The server enforces these combinations, so a schedule missing a value its frequency needs is rejected with an error such as daily schedules must specify the hour of the day.

Use --retention with any frequency to set how long each snapshot is kept.

neon snapshots schedule set [options]
OptionDescriptionTypeDefaultRequired
--branch, -bBranch id or name. Defaults to the branch in your context, or the project's default branch.stringNo
--dayDay of the week/month (1-31) to take the snapshot (used with --frequency).numberNo
--frequencyHow often to take snapshots. Combine with --hour, --day, and --retention to build a single-entry schedule. Possible values: daily, weekly, monthlystringNo
--hourHour of the day (0-23) to take the snapshot (used with --frequency).numberNo
--monthMonth of the year (1-12) to take the snapshot (used with --frequency).numberNo
--retentionHow long to keep each snapshot, in seconds (min 3600). Omit to keep indefinitely.numberNo
--scheduleFull schedule as JSON, for multi-entry schedules, e.g. '[{"frequency":"daily","hour":3,"retention_seconds":604800}]'. Overrides the single-entry flags.stringNo
--project-idProject IDstringNo

Of the options above, --month is the exception: none of the supported frequencies read it, so setting it has no effect on when snapshots are taken.

Set a daily 03:00 snapshot kept for 7 days (604800 seconds):

neon snapshots schedule set --branch main --frequency daily --hour 3 --retention 604800

Set a weekly snapshot on Mondays at 04:00:

neon snapshots schedule set --branch main --frequency weekly --day 1 --hour 4

Set a multi-entry schedule with JSON:

neon snapshots schedule set --branch main --schedule '[{"frequency":"daily","hour":3},{"frequency":"weekly","day":1,"hour":4}]'

--retention is in seconds, from 3600 (1 hour) to 3024000 (35 days). Omit it and scheduled snapshots are kept for 35 days, the maximum. Manual snapshots created with snapshots create follow the opposite rule: they never expire unless you set --expires-at. See Snapshot retention.

Was this page helpful?
Edit on GitHub

On this page

Copy neon init command