Lakebase Postgres has point-in-time recovery (called instant restore) built in for root branches, such as production. Child branches don't support it; you reset them from their parent instead. The storage engine keeps a continuous log of WAL records, so you can restore a root branch to any moment within the history window, with no pgBackRest, WAL-G, or Barman setup and no base-backup-plus-WAL-replay wait.

How to restore

From the Neon CLI:

# Restore the production branch to a timestamp, keeping the pre-restore state as a backup
neon branches restore production ^self@2026-05-15T14:30:00Z \
  --preserve-under-name production_pre_restore

From the API:

curl -X POST https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches/$BRANCH_ID/restore \
  -H "Authorization: Bearer $NEON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "source_branch_id": "'$BRANCH_ID'",
    "source_timestamp": "2026-05-15T14:30:00Z",
    "preserve_under_name": "production_pre_restore"
  }'

The restore overwrites the branch with its state at that timestamp and usually takes a few seconds. Connection strings stay the same. Existing connections are interrupted during the restore, and your app can reconnect as soon as it finishes (instant restore).

How far back you can go

The maximum history window depends on your plan. New paid-plan projects default to 1 day, so raise it in Settings if you want the full window (history window).

PlanMax history windowCost
Free plan6 hours, capped at 1 GB of changes$0
Launch planUp to 7 days$0.20/GB-month
Scale planUp to 30 days$0.20/GB-month

You can only restore root branches, so history storage is billed only on root branches. Child branches don't add to this charge (plans).

Time Travel Assist

Before you overwrite a production branch, confirm the data at the target timestamp looks right. Time Travel Assist lets you run read-only queries against a past state without restoring anything, so you can find when a bad migration ran or a row got deleted.

Restore is an overwrite, not a merge

A restore replaces the data and schema of every database on the branch with their state at the target time. Everything written after that point is excluded. Neon keeps the pre-restore state in a backup branch (named {branch}_old_{timestamp} in the Console, or the name you pass to --preserve-under-name), so you can undo the restore. Object Storage and Functions aren't part of the database timeline, so a restore doesn't revert them.

Snapshots for known-good points

To keep a copy of a branch that outlives the rolling history window, take a snapshot. The Free plan includes 1 manual snapshot, and the Launch and Scale plans include 100. Paid plans can also schedule automated backups, which don't count toward that limit. Snapshot storage is billed at $0.09/GB-month. You can restore a snapshot onto the existing branch in one step, or to a new branch you inspect first.

How this compares to other Postgres services

Most managed Postgres services offer PITR. They differ in where the restore lands and how you pay for it.

ProviderMax history windowRestore destinationNotes
Neon30 days (Scale plan)Overwrites the branch in place; auto-creates a backup branchBuilt in, billed per GB-month of change history on root branches
Amazon RDS for PostgresUp to 35 daysRestores to a new database instanceSetting retention to 0 days disables automated backups
Aurora PostgresUp to 35 daysRestores to a new database clusterContinuous, incremental automated backups that can't be disabled
SupabaseUp to 28 daysRestores in place; the project is inaccessible during the restorePITR add-on from about $100/month for 7 days, requires Small compute or larger; daily backups otherwise (none on Free)

A Neon restore doesn't copy data or boot a new instance. Neon creates a new branch at the target point in the existing storage history, moves your compute onto it, and renames it to match the original branch (technical details).

Set up instant restore

Configure your history window and try a point-in-time restore in the Neon Console.