Backups
List backup safety holds in every organization
Platform administrators only. Lists live holds across organizations, optionally for one environment (which may be archived). A hold on a shared physical host blocks every backup on that host until it is resolved.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Query Parameters
environment_idstringEnvironment UUID
"uuid"pageintegerPage number
per_pageintegerPage size
OK
Verify and release a backup hold in any organization
Platform administrators only, for holds of archived environments or holds blocking a shared host. The same proof as the tenant endpoint is required; the audit entry is written to the hold's organization.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredExplicit cleanup confirmation
confirmStopAndCleanupbooleanPath Parameters
env_idRequiredstringEnvironment UUID
"uuid"job_idRequiredstringBackup River job ID (decimal int64, as a string)
OK
List hosts that cannot take a new backup
Platform administrators only. Lists environments whose backups wait on their host although no hold row backs the wait: the host inventory is not clear (for example a host-operation record no operation of the organization owns, which may be another organization's on a shared host), or another hold on the host is overdue. Each entry names the server, the kind, and the host job directory or operation to check. An entry clears automatically once the next backup finds the host clear.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Query Parameters
pageintegerPage number
per_pageintegerPage size
OK
List backup alerts
Returns backup alerts for the organization, optionally filtered by dismissed status.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Query Parameters
is_dismissedbooleanFilter by dismissed status (default false)
limitintegerResults per page (default 50, max 100)
OK
Get backup alert count
Returns the count of unread and undismissed backup alerts for the organization.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
OK
Dismiss a backup alert
Marks a backup alert as dismissed so it no longer appears in active alerts.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
idRequiredstringAlert UUID
OK
Mark a backup alert as read
Marks a backup alert as read without dismissing it.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
idRequiredstringAlert UUID
OK
Get cron expression presets
Returns a list of common cron expression presets for backup scheduling.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
OK
Get backup details
Returns a single backup's details including size, status, and destination info.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
idRequiredstringBackup UUID
OK
Delete a backup
Marks a backup for deletion and enqueues async cleanup from all storage destinations.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
idRequiredstringBackup UUID
OK
Stream backup progress (SSE)
Streams backup progress events as Server-Sent Events until the backup completes or fails.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
idRequiredstringBackup UUID
SSE stream of backup progress
Trigger a backup restore
Validates the restore target and enqueues an asynchronous restore job. Requests with pitrTimestamp are rejected with PITR_UNAVAILABLE until physical base-backup metadata is available. A production target environment also requires the restore:production permission (Owner and Admin); manage:environments alone is refused with 403.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredRestore target configuration
backupIdstringnewEnvironmentNamestringreserved for disabled targetType="new"
pitrTimestampstringoptional point-in-time recovery target
targetEnvironmentIdstringrequired if targetType="other"
targetTypestring"same" or "other" ("new" is disabled until orchestration exists)
Path Parameters
idRequiredstringBackup UUID
Accepted
Stream restore progress (SSE)
Streams restore progress events as Server-Sent Events until the restore completes or fails.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
idRequiredstringBackup UUID
SSE stream of restore progress
List unresolved backup safety holds
Returns running and verification-required holds for one organization-owned environment, including archived environments. Job IDs are strings to preserve int64 precision.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
env_idRequiredstringEnvironment UUID
"uuid"Query Parameters
pageintegerPage number
per_pageintegerPage size
OK
Verify and release an orphaned backup hold
Requires restore:production permission, an explicit confirmation, a terminal River job past its worst-case lifetime, and proof the host has no active dump or transfer readers. Staging cleanup and an audit entry are required before the hold is released. Unreachable or ambiguous hosts remain blocked; a 409 names the reason and, where useful, the host job directory or operation to check.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredExplicit cleanup confirmation
confirmStopAndCleanupbooleanPath Parameters
env_idRequiredstringEnvironment UUID
"uuid"job_idRequiredstringBackup River job ID (decimal int64, as a string)
OK
Get backup schedule
Returns the current backup schedule for the environment, or 404 if no schedule exists.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
env_idRequiredstringEnvironment UUID
OK
Create or update backup schedule
Creates or updates the automated backup schedule for the environment including frequency, retention, and PITR settings.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredSchedule configuration
dbCronstringdbFrequencystringdestinationIdsarray<string>enabledbooleanfullCronstringfullFrequencystringpausedbooleanretainDailyintegerretainDailyDaysintegerretainDbDailyintegerretainDbHourlyintegerretainDbMonthlyintegerretainDbWeeklyintegerretainFullDailyintegerretainFullHourlyintegerretainFullMonthlyintegerretainFullWeeklyintegerretainHourlyintegerretainHourlyDaysintegerretainMonthlyintegerretainMonthlyDaysintegerretainWeeklyintegerretainWeeklyDaysintegertimezonestringwalEnabledbooleanwalRetentionDaysintegerPath Parameters
env_idRequiredstringEnvironment UUID
OK
Preview retention policy impact
Simulates retention policy changes and returns which backups would be deleted.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredProposed retention settings
retainDailyintegerretainDailyDaysintegerretainDbDailyintegerretainDbHourlyintegerretainDbMonthlyintegerretainDbWeeklyintegerretainFullDailyintegerretainFullHourlyintegerretainFullMonthlyintegerretainFullWeeklyintegerretainHourlyintegerretainHourlyDaysintegerretainMonthlyintegerretainMonthlyDaysintegerretainWeeklyintegerretainWeeklyDaysintegerPath Parameters
env_idRequiredstringEnvironment UUID
OK
List environment backups
Returns backups for the environment with optional status/type filters and pagination.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
env_idRequiredstringEnvironment UUID
Query Parameters
statusstringFilter by backup status
typestringFilter by backup type
limitintegerResults per page (default 20, max 100)
offsetintegerOffset for pagination
OK
Trigger a manual backup
Creates a backup record and enqueues an asynchronous backup job for the environment.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredBackup configuration (type, label, destination)
typestring"db", "full" or "base" (physical base backup for point-in-time recovery; needs WAL archiving)
Path Parameters
env_idRequiredstringEnvironment UUID
Accepted
Get PITR coverage
Returns what point-in-time recovery can reach: the recoverable ranges formed by physical base backups and continuous, cluster-keyed archived WAL, the base backups that anchor them, and explicit gaps where WAL is missing. available=false with reasonCode=physical_base_metadata_unavailable (no base backup yet) or reasonCode=wal_coverage_unavailable (WAL does not yet make a base consistent). Logical pg_dump backups are never reported as bases.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
env_idRequiredstringEnvironment UUID
OK
List point-in-time recoveries
Returns the environment's 20 most recent point-in-time recoveries.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
env_idRequiredstringEnvironment UUID
OK
Start a point-in-time recovery
Recovers the environment's database to targetTime in a separate scratch PostgreSQL cluster on the same server: a physical base backup plus archived WAL, replayed until just before the first transaction after targetTime. The live database is not touched; promote the verified recovery to replace it. Refused (PITR_TARGET_NOT_COVERED) when no base backup with continuous WAL reaches targetTime, and while another recovery of the environment is active or another operation holds the instance.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredTarget time
targetTimeRequiredstringPath Parameters
env_idRequiredstringEnvironment UUID
Accepted
Get a point-in-time recovery
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
env_idRequiredstringEnvironment UUID
restore_idRequiredstringRecovery UUID
OK
Discard or cancel a point-in-time recovery
Cancels a queued or running recovery, or discards a verified or failed one, and removes its scratch cluster and staged data from the server. The live database is not touched.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
env_idRequiredstringEnvironment UUID
restore_idRequiredstringRecovery UUID
Accepted
Promote a verified point-in-time recovery
Replaces the live database with the verified recovery. Requires the restore:production permission (Owner and Admin), confirmOverwrite=true and confirmDatabaseName equal to the recovery's database name. Refused unless the recovery is verified and the live database (color and name) is still the one bound when the recovery was requested. The staged decrypted data is removed first; the host must have room for the dump and a temporary copy, and the live archiver must be healthy. The recovered dump is restored beside the live database with --exit-on-error and must reproduce the recovery's exact row-count fingerprint; only then is the live database fenced and renamed aside (kept, named in previousDatabaseName) and Odoo restarted. Files in the filestore are not rewound.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredConfirmation
confirmDatabaseNamestringconfirmOverwritebooleanPath Parameters
env_idRequiredstringEnvironment UUID
restore_idRequiredstringRecovery UUID
Accepted
Inspect or resolve a point-in-time promotion that needs attention
For a recovery in needs_attention (a promotion that stopped mid-swap). Requires restore:production (Owner and Admin). Databases are identified by OID: before its first rename the swap records the OIDs of the original live database and of the recovered copy. action=inspect queues a read-only inspection of the server: the database, _restore_tmp and pre_restore* with their OIDs and whether they accept connections, the promotion's OID record, what odoo.conf points at, and whether maintenance mode is on; the result appears as the recovery's resolution, with the resolutions it allows. action=keep_live (the live database is correct) clears its fence, checks it accepts connections, restarts Odoo, lifts maintenance and releases the lock; allowed only when odoo.conf still names the recovery's database, it exists, and it is the original or the recovered copy. action=restore_previous renames the original (by OID, under a _pre_restore name) back to the live name under the swap's fence, moving a recovered copy in the live name to a fresh _pre_restore name, then restarts Odoo and lifts maintenance; allowed only when the live name is absent or is the recovered copy (by OID). Both need confirmDatabaseName and an inspection from the last 15 minutes, and refuse if a fresh inspection differs from it. action=dismiss (with confirmDatabaseName) closes the recovery without touching any database, removing the scratch copy and alerts; only once the promotion's hold on the instance has been released (PITR_HOLD_ACTIVE otherwise). Anything ambiguous is refused with the inspected state.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredResolution
actionstringconfirmDatabaseNamestringPath Parameters
env_idRequiredstringEnvironment UUID
restore_idRequiredstringRecovery UUID
Accepted
Apply WAL archiving to the running database
Recreates only the environment's PostgreSQL container so its archive_mode matches the schedule's walEnabled. PostgreSQL restarts: Odoo loses its database for roughly 10 to 60 seconds. Odoo's configuration and container are not changed. Requires confirmDatabaseRestart; refused while another operation holds the instance, and refused when enabling without a backup destination.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Request Body
application/jsonRequiredConfirmation
confirmDatabaseRestartbooleanPath Parameters
env_idRequiredstringEnvironment UUID
Accepted
List environment restore logs
Returns restore logs where the target or source environment matches the given environment.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
environmentIdRequiredstringEnvironment UUID
OK
List project backups
Returns all backups across all environments in the project with environment metadata.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
projectIdRequiredstringProject UUID
Query Parameters
statusstringFilter by backup status
limitintegerResults per page (default 50, max 100)
offsetintegerOffset for pagination
OK
Stream restore operation progress
Streams Server-Sent Events for a restore operation keyed by restore log ID.
Authorization
Authorization<token>JWT Bearer token (format: Bearer {token})
In: header
Path Parameters
restoreLogIdRequiredstringRestore log UUID
SSE stream of restore progress
Download backup component
Streams a decrypted backup component without buffering. Browser navigation uses the authenticated session; API clients may use their session cookie, oCore API key, or a legacy one-time token.
Authorization
access_token<token>Browser session JWT sent as the access_token cookie.
In: cookie
Authorization<token>oCore API key sent as Authorization: Bearer ocore_. JWT bearer tokens are not accepted for these operations.
In: header
token<token>Short-lived one-time token returned by the backup download preparation endpoint
In: query
Path Parameters
idRequiredstringBackup ID (UUID)
Query Parameters
componentstringBackup component
"db"Value in: "db" | "filestore" | "config"organization_idstringSelected organization for session-authenticated browser downloads
tokenstringLegacy short-lived one-time download token
OK
Prepare backup download
Validates the selected tenant, completed backup, and requested component before returning a session-authenticated URL for a browser-native download.
Authorization
access_token<token>Browser session JWT sent as the access_token cookie.
In: cookie
Authorization<token>oCore API key sent as Authorization: Bearer ocore_. JWT bearer tokens are not accepted for these operations.
In: header
Path Parameters
idRequiredstringBackup ID (UUID)
Query Parameters
componentstringBackup component
"db"Value in: "db" | "filestore" | "config"OK