Backups & snapshots
A snapshot is a point-in-time capture of a site — its
database and files together. You take a snapshot with a backup, restore one in
place, and read a per-site rollup across your whole account at GET /v1/backups/status.
Snapshots are how you roll back data, where a
deployment rollback rolls back code.
The snapshot object
Section titled “The snapshot object”| Field | Type | Description |
|---|---|---|
id |
string | Stable identifier, e.g. snap_01J8.... |
site_id |
string | The site this snapshot was taken from. |
taken_at |
string | RFC 3339 timestamp of the capture. |
size_bytes |
integer | Size of the snapshot. |
tags |
string | How the snapshot came to be, e.g. scheduled vs on-demand. |
synced_at |
string | When the snapshot was last synced to off-host storage. |
retention_reason |
string | null | Why the snapshot is being kept beyond the normal window, if it is. |
List snapshots
Section titled “List snapshots”GET /v1/sites/{siteID}/snapshots
Section titled “GET /v1/sites/{siteID}/snapshots”backups:read List a site’s snapshots, cursor-paginated.
curl "https://api.managed.dev/v1/sites/site_01J7.../snapshots?limit=20" \ -H "Authorization: Bearer mfk_live_..."{ "data": [ { "id": "snap_01J8...", "site_id": "site_01J7...", "taken_at": "2026-06-24T03:00:11Z", "size_bytes": 412300544, "tags": "scheduled", "synced_at": "2026-06-24T03:12:40Z", "retention_reason": null } ], "pagination": { "next_cursor": "eyJ0...", "has_more": true }, "request_id": "req_01J9..."}Take a backup
Section titled “Take a backup”POST /v1/sites/{siteID}/backup
Section titled “POST /v1/sites/{siteID}/backup”backups:write Take a snapshot now. Returns a 202
job (type backup.create); the new snapshot_id is on
the job’s result when it succeeds.
curl -X POST https://api.managed.dev/v1/sites/site_01J7.../backup \ -H "Authorization: Bearer mfk_live_..." \ -H "Idempotency-Key: 3f8c...b1"job, err := client.Backups.Create(ctx, "site_01J7...")if err != nil { return err }done, err := client.Jobs.WaitSuccess(ctx, job.ID, nil)// done.Result["snapshot_id"] identifies the new snapshotmf backups create --site site_01J7... --wait{ "data": { "id": "job_01J9...", "type": "backup.create", "status": "queued", "progress": 0, "created_at": "2026-06-24T14:50:33Z", "resource": { "type": "backup", "id": "site_01J7...", "site_id": "site_01J7..." }, "result": null, "error": null, "links": { "self": "/v1/jobs/job_01J9...", "stream": "/v1/jobs/job_01J9.../stream" } }, "request_id": "req_01J9..."}Restore a snapshot
Section titled “Restore a snapshot”POST /v1/sites/{siteID}/snapshots/{snapID}/restore
Section titled “POST /v1/sites/{siteID}/snapshots/{snapID}/restore”backups:write Restore a snapshot in place,
replacing the site’s current database and files. Returns a 202
job (type backup.restore).
curl -X POST https://api.managed.dev/v1/sites/site_01J7.../snapshots/snap_01J8.../restore \ -H "Authorization: Bearer mfk_live_..." \ -H "Idempotency-Key: a90d...5e"job, err := client.Backups.RestoreSnapshot(ctx, "site_01J7...", "snap_01J8...")mf backups restore snap_01J8... --site site_01J7... --yes --waitAccount-wide backup status
Section titled “Account-wide backup status”GET /v1/backups/status
Section titled “GET /v1/backups/status”backups:read A cross-site rollup: for every site
you own, the latest snapshot’s age and size plus the status of the last backup job.
One call answers “is everything backed up?” — for a dashboard or a nightly check.
truncated is true when your owned-site set exceeded the per-request cap.
curl https://api.managed.dev/v1/backups/status \ -H "Authorization: Bearer mfk_live_..."status, err := client.Backups.Status(ctx)mf backups status{ "data": { "truncated": false, "sites": [ { "site_id": "site_01J7...", "slug": "acme-store", "domain": "acme-store.com", "latest_snapshot_at": "2026-06-24T03:00:11Z", "snapshot_age_seconds": 42600, "size_bytes": 412300544, "last_backup_status": "succeeded" } ] }, "request_id": "req_01J9..."}