curl --request POST \
--url https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"disk_id": "77777777-7777-4777-8777-777777777777"
}
'import requests
url = "https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage"
payload = { "disk_id": "77777777-7777-4777-8777-777777777777" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({disk_id: '77777777-7777-4777-8777-777777777777'})
};
fetch('https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'disk_id' => '77777777-7777-4777-8777-777777777777'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage"
payload := strings.NewReader("{\n \"disk_id\": \"77777777-7777-4777-8777-777777777777\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"disk_id\": \"77777777-7777-4777-8777-777777777777\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"disk_id\": \"77777777-7777-4777-8777-777777777777\"\n}"
response = http.request(request)
puts response.read_body{
"id": "66666666-6666-4666-8666-666666666666",
"node_id": "33333333-3333-4333-8333-333333333333",
"reservation_id": "11111111-1111-4111-8111-111111111111",
"status": "provisioning",
"operation": "provision",
"operation_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"operation_status": "queued",
"operation_started_at": "2026-10-20T14:00:00Z",
"operation_completed_at": null,
"stages": [],
"failure": null,
"ready_at": null,
"hostname": "ornn-vm-11111111-0",
"ip": "203.0.113.10",
"tenant_username": null,
"port": 2222,
"gpu_count": 8,
"disk_id": "77777777-7777-4777-8777-777777777777",
"created_at": "2026-10-15T00:02:11Z",
"destroy_at": null
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "disk_admission_denied",
"message": "That disk belongs to another organization. Choose one of your disks or an Ornn disk."
}
}{
"detail": {
"code": "virtual_machine_not_found",
"message": "Ornn could not find that virtual machine."
}
}{
"detail": {
"code": "virtual_machine_not_reimageable",
"message": "This VM cannot be reimaged right now. Reimage a running VM, or one whose last start failed, once any stop or cleanup has finished."
}
}{
"code": "<string>",
"detail": "<string>"
}Reimage a VM
Rebuilds one VM from a disk you choose, on the same node and reservation. Everything on the VM’s current disk is erased. The VM keeps its id, hostname, GPUs, and size. Any member of the reservation’s organization can reimage. The VM must be running, or its last start must have failed. A VM on a private network stays private and keeps its private address. The new disk boots with the reservation’s selected SSH keys, or every active key on your account when none is selected. A 202 response is acceptance, not readiness. The VM returns to provisioning; poll the reservation’s VM list until status is running, then reconnect with the returned ip and port. If the reimage fails, the reservation stays active and you can reimage again.
curl --request POST \
--url https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"disk_id": "77777777-7777-4777-8777-777777777777"
}
'import requests
url = "https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage"
payload = { "disk_id": "77777777-7777-4777-8777-777777777777" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({disk_id: '77777777-7777-4777-8777-777777777777'})
};
fetch('https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'disk_id' => '77777777-7777-4777-8777-777777777777'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage"
payload := strings.NewReader("{\n \"disk_id\": \"77777777-7777-4777-8777-777777777777\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"disk_id\": \"77777777-7777-4777-8777-777777777777\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/orchestrator/nodes/{node_id}/virtual-machines/{vm_id}/reimage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"disk_id\": \"77777777-7777-4777-8777-777777777777\"\n}"
response = http.request(request)
puts response.read_body{
"id": "66666666-6666-4666-8666-666666666666",
"node_id": "33333333-3333-4333-8333-333333333333",
"reservation_id": "11111111-1111-4111-8111-111111111111",
"status": "provisioning",
"operation": "provision",
"operation_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"operation_status": "queued",
"operation_started_at": "2026-10-20T14:00:00Z",
"operation_completed_at": null,
"stages": [],
"failure": null,
"ready_at": null,
"hostname": "ornn-vm-11111111-0",
"ip": "203.0.113.10",
"tenant_username": null,
"port": 2222,
"gpu_count": 8,
"disk_id": "77777777-7777-4777-8777-777777777777",
"created_at": "2026-10-15T00:02:11Z",
"destroy_at": null
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "disk_admission_denied",
"message": "That disk belongs to another organization. Choose one of your disks or an Ornn disk."
}
}{
"detail": {
"code": "virtual_machine_not_found",
"message": "Ornn could not find that virtual machine."
}
}{
"detail": {
"code": "virtual_machine_not_reimageable",
"message": "This VM cannot be reimaged right now. Reimage a running VM, or one whose last start failed, once any stop or cleanup has finished."
}
}{
"code": "<string>",
"detail": "<string>"
}Authorizations
Create an organization API key in Account Settings > Developer. Do not send this key to the Kubernetes API server.
Path Parameters
The VM's node_id from the reservation's VM list.
The VM's id from the reservation's VM list.
Body
A disk from GET /v1/orchestrator/disks. Use one of your organization's disks or a disk Ornn provides.
Response
Reimage accepted. The body is the VM, now provisioning from the new disk.
VM id. Reboot a VM and reimage take this ID with its node_id. The host reboot and hard reset route takes a node ID, not this ID.
The host node running the VM.
provisioning, running, failed, or deleting. Treat any other value as not ready.
Customer launch progress for the latest provision, in order.
Show child attributes
Show child attributes
The latest operation, provision, destroy, or reboot. A VM stays running during a reboot.
queued, running, succeeded, or failed.
Present when the VM or its latest operation failed. code is virtual_machine_provision_failed, virtual_machine_cleanup_failed, or virtual_machine_reboot_failed.
Show child attributes
Show child attributes
When the VM first became ready. Set only while running.
The VM's hostname. Not an SSH address.
SSH address. Present while provisioning or running.
Linux login, tenant. Present only while running.
SSH port. Present while provisioning or running. Do not assume 22.
Was this page helpful?