Snapshots
A snapshot is a point-in-time copy of one volume:- Console
- API
- CLI
- Go
Go to Storage → Snapshots and choose Create Snapshot, then pick the
Volume and give it a Name. The volume’s own page has a Create
Snapshot button that opens the same form with that volume already
selected; it is disabled unless the volume is
available or in_use.1
Take it
Allowed against a volume in
available or in_use — you do not have
to detach to snapshot. The snapshot is created asynchronously (202,
status creating).2
Wait for available
Poll
GET /v1/snapshots/{snapshot_id}. available means the snapshot is
complete and can be restored from; error means an active error fault —
read faults.name return a validation error, including
unchanged, empty or null values. Existing snapshots retain their current names.
A snapshot name is unique per volume, so nightly on two different volumes
is fine.
Snapshot responses separate stored data from the capacity needed to restore:
Snapshots share unchanged data. Each snapshot shows its attributed share, and
summing the shares gives the total for that volume’s snapshot chain. Deleting a
snapshot can move its share to a surviving snapshot. Its displayed size is not
a promise of how much space deleting it will free. Measurements run
asynchronously; reads do not trigger a storage scan.
Snapshots currently depend on their source volume. You must delete its snapshots
before deleting the source volume. A snapshot used by a restored volume is also
protected from deletion while that dependency exists.
Billing
From 2026-10-16 00:00 UTC, snapshot billing uses measured retained logical data, with unchanged data counted once across a volume’s snapshot chain. Measurements exclude compression and replication effects. A first snapshot’s retained data counts even when it still shares blocks with the live volume. The volume remains billed separately by its provisioned capacity. For example, two identical snapshots containing 10 GiB of written data on a 100 GiB volume retain 10 GiB across their chain. Later overwrites can retain multiple versions of the changed data. For each UTC hour, billing records the first valid measured total for the chain and charges it once after the hour ends. Later changes affect future hours. If an hour has no valid measurement, no snapshot usage is charged for that hour; the volume’s capacity is never substituted for a missing measurement. Snapshot prices remain unchanged. The price catalogue’sGB-month unit uses
1,073,741,824 bytes per GB and the actual number of hours in the UTC calendar
month: each hourly quantity contributes retained_bytes / 2^30 / hours_in_month
GB-month. Usage before the change keeps the previous capacity-based calculation;
previous charges are not recalculated.
Restoring from a snapshot
Restoring means creating a new volume from the snapshot. There is no in-place rollback:- Console
- API
- CLI
- Go
On Create Volume, switch Source to From snapshot and choose the
Snapshot. Size (GB) must meet the snapshot’s minimum restore capacity, and the
Tier is yours to pick — a restore is not tied to the tier the source
volume was on.Storage → Snapshots also has a Create volume from snapshot row
action that opens the same form with the snapshot filled in.
available. The new volume’s size_gb must be at least
the snapshot’s restore_size_bytes divided by 2^30 — you can restore onto a larger volume, never a smaller
one. The restored volume records source_snapshot as a ResourceRef, which is also what stops
retention from reaping a snapshot something still depends on.
Snapshot responses include volume and, for scheduled snapshots, snapshot_policy
as ResourceRefs with id, crn, and name.
Snapshot policies
A policy is a schedule attached to one volume: take a snapshot everyinterval_minutes, then keep at most retention_count of the snapshots that
policy created.
- Console
- API
- CLI
- Go
Open the volume’s Snapshot schedules tab and choose Create schedule.
Fill in Name, Every (minutes), Keep, and optionally
Also delete after (days), then choose Create schedule.Each row has actions to edit, pause or resume, and delete that schedule.
Editing opens its settings; Save applies your changes.
up to 16 policies per volume
required
Each policy has its own interval, retention settings, and enabled state.
Names must be unique within the volume. Different volumes can use the same name. Overlapping schedules create
separate snapshots, each counting toward your snapshot quota. Shared stored data is counted once.
A seventeenth policy returns
409.1–43200
required
A minimum gap, not an exact cadence. A snapshot lands at or after the
interval and never before, and can land a minute or two late when the
scheduling pass is busy. The floor is one minute because that is how often
the pass evaluates schedules; the ceiling is 30 days.
1–256
required
How many of this policy’s snapshots to keep. When a run takes the count past
this, the oldest go first.
0–3650, default 0
An optional age bound applied on top of the count: a snapshot outside
either window is reaped.
0 means no age bound.The first snapshot lands one interval from now. Attaching a schedule is not
itself a request for a snapshot — use
POST /v1/snapshots if you want one
immediately.name; supplying it, even
unchanged, empty or null, returns a validation error. You can still change
the interval, retention settings, description, tags and enabled state. Existing
policies retain their current names.
Scheduled snapshots are named <policy>-<UTC timestamp>, for example
nightly-20260115T000000Z, and they inherit the policy’s tags so a listing
tells you which schedule produced them without a second lookup.
What retention will never delete
A schedule is also an automatic deleter, so the limits on what it can remove matter more than the limits on what it keeps:Snapshots you took by hand
Retention only matches snapshots carrying this policy’s
snapshot_policy. A snapshot a person created has none and is never a
candidate, whatever tags it has.Snapshots something depends on
A snapshot a volume was created from — including a restore still running —
is skipped and re-examined on a later run. It becomes reapable once the
dependent volume is gone.
The single newest snapshot
The newest snapshot is exempt from the age bound. A volume that could
not be snapshotted for longer than the window never loses its whole
history that way.
Anything, while paused
enabled: false stops new snapshot runs and retention deletions from being
claimed. Work already claimed before the pause may finish. Other policies
on the same volume keep running independently.Reading a schedule’s state
GET /v1/volumes/{volume_id}/snapshot-policies/{policy_id} returns where the policy is in its
cycle:
faults is the field to check on a schedule that has stopped producing
snapshots — it carries reasons like an exhausted snapshots quota, or a volume
that was mid-extend when the window came around. Dispatch, execution and
retention each have their own code and recover independently.
The Snapshot schedules table shows each policy’s next and last run and any
active faults, so a stalled schedule can be read without leaving the console.
A missed window costs one snapshot, not one per window missed.
next_run_at is re-stamped to now + interval_minutes each time the policy
fires, never to previous + interval, so a schedule that could not run for
six hours takes a single snapshot when it resumes rather than a catch-up
burst. Changing interval_minutes re-bases the next run off now too, so
shortening a daily schedule to hourly takes effect within the hour.Resource references
Usevolume with an account-owned volume UUID, CRN, or exact name when creating a snapshot. Snapshot-policy endpoints identify the volume by UUID in the path. Snapshot CRNs include their parent, for example crn:storage:sa-saopaulo-1:my-account:volume/data/snapshot/nightly.
List filters use exact name and crn matches. A snapshot name filter requires volume; snapshot_policy accepts a policy UUID or nested CRN, or a policy name when volume is supplied. Restore requests use source_snapshot with a UUID or nested CRN, since they do not pin a source volume. Malformed CRNs return 400; valid CRNs outside the requested account, region, or resource type return an empty page.
