Names are movable tags
How
debian-13 and debian-13:20260807 differ, and when the tag moves
under you.Importing
Presigned URL in, background conversion, and what the status column tells
you.
What the listing shows
Why a build you published yesterday is missing, and the flag that brings
it back.
Images
Your images and the platform catalog
GET /v1/images returns only images owned by your selected account. Your images
remain private to that account; publishing them to other accounts is not
supported. Images have no visibility field or filter.
Use GET /v1/image-catalog to choose an image for a new instance. Its
categories array groups images under platform and account. Each entry
describes the current active build of one image name and architecture, with
its ID, CRN, OS, minimum disk and memory sizes, and end-of-life date when known.
The catalog omits tags and operational metadata. It accepts name, os and
architecture filters and paginates with limit and marker across both
categories.
Platform images are maintained OS images available to every account. Their
CRNs belong to the platform account
(crn:compute:<region>:platform:image/<name>/architecture/<arch>/version/<version>).
Selecting a platform image does not give you permission to change or delete it.
A name is a tag, a version is a build
Every image row has aname and a version, and they do different jobs.
name
A movable tag, shared by every build behind it.
debian-13 points at
whichever build is current for its (name, architecture).version
Identifies one build within that name, and must be unique there. Omit
it on import and the server stamps a UTC timestamp, so every build is
addressable whether or not you labelled one.
is_current on the image says whether it is the name’s current target. Older
active versions stay bootable by id and by name:version. Promotion moves a
pointer; withdrawal or deletion makes a build unavailable for new launches.
Publishing a version the name already carries returns
409. It does not
replace the existing build or move the current pointer. Publish a new
version; do not delete the existing build to make a retry overwrite it.Importing an image
No image bytes flow through the API. You upload the disk to a bucket you control — the Basaltic object store, S3, MinIO, anything — with a real multipart S3 client, then hand over a presigned GET URL. Import an AMD64 (x86-64) Linux image. Thearchitecture field accepts only
amd64, which is also its default; ARM images are not supported.
Set os to almalinux, alpine, arch, centos, debian, fedora,
opensuse, rhel, rocky or ubuntu. For another Linux distribution, use
linux (the default). Keep the release in the separate os_version field.
Unsupported architecture or OS values return 400 INVALID_INPUT before an
import is created.
1
Register the import
- Console
- API
- CLI
- Go
Go to Compute → Images in the target region and choose Import image.
Enter Name and an optional Version.
Paste the presigned HTTPS GET URL into Source URL. Choose an
Operating system and optionally enter OS version. Choose
Other / generic Linux for another distribution.
Architecture is fixed to AMD64 (x86-64).
Leave Version blank for a server-generated UTC timestamp.Choose Import image. Import accepted reports the returned
importing status and opens the image page. The image is private to
your account. Once active, it becomes the current build for its name
and architecture, changing future launches that use the bare name.
202 with status: "importing". The platform automatically
detects qcow2, raw, vmdk, vhd, vhdx and vdi from the downloaded
disk and converts it to a raw base. You do not supply a format.2
Wait for the fetch and conversion
A worker fetches the URL once, converts the disk and imports it. The URL is
not retained afterwards, so it only has to stay valid long enough to be
read.
3
Poll until active
In the console, use Refresh on the image page or Compute → Images.
The Status column shows the latest import attempt’s error while retrying,
or the terminal failure when the status reaches error. The same error is
visible on the image page.Through the API:
active means bootable, and size_bytes is filled in from what was
actually written. error means the import gave up; read faults for the
reason.An entry in
faults does not mean the import has stopped. Each failed
attempt of the same code refreshes that row and increments occurrences
rather than adding another, and the import is retried. The row reaching
error is what says nothing further will be attempted.Publishing without switching the tag
current defaults to true: a completed import becomes the name’s current
version and future launches of that bare name boot the new bits. Send
"current": false to stage a build without switching, then promote it later:
(name, architecture)
is demoted in the same operation. The same call is how you roll back: point
the name at the older build and launches follow it immediately.
The switch happens when the import completes, not when it is accepted. A
new build is
importing for as long as the conversion takes, and the tag
keeps pointing at the previous build for all of it — so publishing over a
name in use never leaves it resolving to something that cannot boot.Only an active image can be made current; asking to promote one that is
still importing is a 400.What List images returns
GET /v1/images lists your account’s current builds and images that need
attention. One name normally contributes one entry; use the catalog endpoint
above to include platform images.
An active build drops out when a newer build holds its name. Withdrawn
builds are also excluded by default:
Still listed: anything importing or errored
Still listed: anything importing or errored
Whatever its age. These are rows you have to deal with — an import you are
waiting on, or one that failed and is still holding an image slot until you
delete it.
Still listed: a newer version staged with current: false
Still listed: a newer version staged with current: false
“Not current” is the wrong test on its own. A version you staged
deliberately, and a version you rolled back from, are both not current
and both still yours to act on. Only being superseded by something newer
takes a build out of the listing.
Withdrawn images: inspect explicitly
Withdrawn images: inspect explicitly
Use
status=withdrawn or all_versions=true to inspect withdrawn images.
They remain readable by ID and retain their data, but cannot be launched.
In the console, choose Withdrawn on Compute → Images; Catalog
restores the default view. Deleting images remain readable until cleanup
finishes.all_versions=true for a tag’s whole history, including withdrawn builds. Results are ordered by
name, and paginate through meta.marker like every other listing.
The other filters are os, architecture, status and name.
The name filter is an exact match.
End of life
eol_date records the day an OS release stops receiving free security updates
for a default install. Absent means nobody has recorded one, which is not
the same as supported indefinitely.
Omit eol_date on a new build and it inherits the date the name’s current
version carries, so republishing a tag cannot quietly stop tracking its
release. An explicit null on PATCH clears it; omitting the field leaves it
alone.
Withdrawn images carry withdrawal_reason. end_of_life identifies a platform
release withdrawal; inspect eol_date for its date. legacy means the image was
already withdrawn and its original reason is unknown. The console shows this
explanation beside the status.
An eol_date on your own image is stored and shown. Automatic end-of-life
withdrawal applies only to platform images; it does not withdraw your own images.
Deleting an image
- Console
- API
- CLI
- Go
Open the image from Compute → Images and choose Delete. The
confirmation requires the image name. Remove references from instances and
instance pools first. After Image deletion accepted, use Refresh to
follow cleanup until the page shows Image not found.Edit and delete controls require ownership by the selected account
and disappear while deleting. Platform catalog
images are read-only outside the platform account.
202 with the image in status: "deleting". Cleanup
runs asynchronously. GET /v1/images/{image_id} returns that resource until
cleanup finishes, then returns 404. A deleting image cannot be launched or
changed. A repeated DELETE returns 404, including while cleanup is running.
If instances or instance pools still reference the image, deletion returns
409 and leaves it unchanged. The server message includes both counts, including
zero: image is in use by 2 instances and 0 pools. Remove those references
before retrying. Withdrawn images have the same checks.
An image already marked for deletion can still be retained for existing
instances or instance pools. In that case, its owner’s list and detail
responses include deletion_retention with reason: "in_use", instances
and instance_pools counts. The console explains which references are holding
the image. This means backing data is being preserved for those resources;
it does not mean the deletion worker has stalled. Cleanup can finish after
the references are removed. The field is omitted when no such references
remain.
Superseded builds of your own images are never reclaimed for you. Every
build you publish holds an
images slot and its bytes against
image_storage_gb until you delete it — so a pipeline that publishes on
every commit needs a deletion step, or the quota becomes the deletion step.Sizes
enforced floor
The smallest boot volume that can hold the image. Defaults at import to the
image’s virtual size rounded up. A launch or reinstall asking for less is
refused.
recorded, not enforced
What the image is documented to need. It is stored and returned for you to
read; nothing stops an instance booting on a flavor below it.
Troubleshooting
An image I just published is not in the listing
An image I just published is not in the listing
Check whether a newer build holds the same name. The default listing shows
one entry per tag, and drops builds a newer one has superseded. Add
?all_versions=true to see the history — the build is still there and
bootable by name:version or by id if its status is active.Launches picked up a different image than last week
Launches picked up a different image than last week
A bare
name follows the tag, and the tag moves when a new build is
published as current. Pin name:version or an id in anything that has to
be reproducible; keep the bare name for “always the latest”.A name stopped resolving
A name stopped resolving
Two causes. A platform release past end of life has been withdrawn — the
error names the release and the date. Or the name has no current version,
which happens after a
PATCH with current: false on the only current
build: the tag then points at nothing, though active builds behind it still
launch by name:version. Promote one to fix it.An import sits in importing forever
An import sits in importing forever
Read
faults — a failed attempt records the reason on the row while
retrying, and a repeated failure of the same code bumps occurrences
rather than adding a row. The usual causes are a presigned URL that expired
before the fetch, a disk whose format cannot be detected or is unsupported,
a disk that references an external backing file, or a host that resolves to
a private address and is refused. Detection and backing-file checks happen
asynchronously after the download; acceptance does not mean the disk is
valid.Note that an import which finishes but exceeds your
image_storage_gb
quota is refused and not retried: rebuilding the same bytes would cost
a full download and conversion to reach the same answer.POST /v1/images answers 409
POST /v1/images answers 409
That name already carries that version. A name is shared by every build
behind it on purpose, so publish under a new
version rather than a new
name.I cannot see another account's image
I cannot see another account's image
That is the design. Only the platform catalog crosses accounts;
visibility: "public" on your own image does not share it, and an image id
belonging to another account answers 404 rather than 403, so the API
never confirms it exists.Next
Launching instances
Flavors, boot volumes, cloud-init and the instance lifecycle.
Instance pools
Where an image reference is resolved once, at create, and every replica
boots the same build.

