ISOs¶
Mount an ISO image on a server to boot an installer or a rescue system from it. HostHatch keeps a library of ISOs, and each project can add one ISO of its own, which we download from a URL you give.
Endpoints¶
| Endpoint | What it does |
|---|---|
POST / |
Mount an ISO |
POST / |
Unmount an ISO |
GET / |
List ISOs |
POST / |
Upload an ISO |
GET / |
Get an ISO |
DELETE / |
Delete an ISO |
The ISO object¶
{
"id": 8980,
"name": "AlmaLinux-10.2-x86_64-dvd.iso",
"type": "custom",
"status": "ready",
"progress": 100,
"created_at": "2026-10-07T14:09:24Z"
}
| Field | Type | Description |
|---|---|---|
id |
integer | The ISO's id, which mounting takes. |
name |
string | Its file name. |
type |
string | library for HostHatch's ISOs, custom for the project's own. |
status |
string | downloading, ready or failed. Library ISOs are always ready. |
progress |
integer | How much is downloaded, from 0 to 100. |
created_at |
string or null | When it was added. |
Library and custom ISOs¶
List ISOs¶
GET /
The ISOs the project's servers can boot from: the project's own custom ISO first, then HostHatch's library.
Upload an ISO¶
POST /
Add the project's custom ISO from a URL. The answer is 201 with the ISO, downloading: poll it until it is ready. Uploads through the API aren't available yet: until they are, this answers 400 feature_unavailable.
{"url": "https://example.com/images/rescue.iso"}
The URL must:
- be at most 255 characters of ASCII, use
httporhttps, and have no user name, password, query string or fragment; - end in the file's name, made of letters, digits, dots, hyphens, underscores and plus signs, and ending in
.iso; - point at a public host, not a private or internal address;
- answer a
HEADrequest with200directly, without redirecting; - be a file that reports its size, at most 10 GiB, with a name the project's owner hasn't uploaded in any of their projects.
A URL that breaks a rule answers 400 validation_error, and the url error's code says which: invalid for the URL itself or the file, unreachable when its host can't be reached or isn't public, redirect, or not_the_file when it answers HEAD with anything but 200.
A project holds one custom ISO: while it has one, an upload answers 409 iso_limit_reached with that ISO's id in iso_id. Delete it to upload another. If you lose the answer to an upload, send it again: if the upload had started, the answer is 409 iso_limit_reached with its id.
Get an ISO¶
GET /
A library ISO, or the project's own. Poll a custom ISO while it is downloading.
Delete an ISO¶
DELETE /
Delete the project's custom ISO. An ISO mounted on a server answers 409 iso_mounted: unmount it first. Library ISOs are shared by every project, so deleting one answers 403 permission_denied.
Mounting¶
Mounting and unmounting are actions, and exclusive: one at a time per server, and not during another exclusive action. Each changes the server's boot order and reboots it. Send an Idempotency-Key with each.
Mount an ISO¶
POST /
Mount an ISO on the server: a library ISO, or the project's own once it is ready. One still downloading, or whose download failed, answers 409 conflict, and any other ISO 404 not_found.
{"iso_id": 8980}
The server's iso field shows the mounted ISO.
Unmount an ISO¶
POST /
Unmount the server's ISO, so it boots from its disk again. The request takes no body.
Errors¶
| Status | Code | When |
|---|---|---|
| 400 | validation_error |
A field is invalid, or the URL doesn't meet the rules above. |
| 400 | feature_unavailable |
Uploading an ISO, while uploads through the API aren't available. |
| 403 | read_only_key |
A change with a read-only key. |
| 403 | permission_denied |
Deleting a library ISO. |
| 403 | billing_account_required |
The project's owner has no billing account. |
| 403 | project_not_ready |
The project is still being set up. |
| 404 | not_found |
No such ISO or server in the project. |
| 409 | iso_limit_reached |
The project already has a custom ISO. |
| 409 | iso_mounted |
Deleting an ISO that is mounted. |
| 409 | action_in_progress |
Another exclusive action is running on the server. |
| 409 | conflict |
Mounting a custom ISO that isn't ready. |
| 409 | idempotency_key_reused |
The key was used for another request. |
| 502 | upstream_error |
A system behind the API failed. |
| 503 | upstream_unavailable |
A system behind the API is unavailable for now. Try again after Retry-After. |
| 503 | node_maintenance |
The server's host is in maintenance. |