curl --request POST \
--url https://api.ornn.com/commerce/reservations/{reservationId}/stop \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ornn.com/commerce/reservations/{reservationId}/stop"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ornn.com/commerce/reservations/{reservationId}/stop', 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/commerce/reservations/{reservationId}/stop",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ornn.com/commerce/reservations/{reservationId}/stop"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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/commerce/reservations/{reservationId}/stop")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/commerce/reservations/{reservationId}/stop")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"reservationId": "11111111-1111-4111-8111-111111111111",
"customerId": "22222222-2222-4222-8222-222222222222",
"status": "completed",
"isSpot": false,
"provisioningType": "virtual-machine",
"gpuSlug": "h100",
"gpusPerNode": 8,
"reservedNodeCount": 1,
"reservedGpuCount": 8,
"startsAt": "2026-10-15T00:00:00Z",
"endsAt": "2026-10-18T09:30:00Z",
"endReason": "stop",
"deployedAt": "2026-10-15T00:02:11Z",
"pendingOperation": null
}{
"reservationId": "11111111-1111-4111-8111-111111111111",
"customerId": "22222222-2222-4222-8222-222222222222",
"status": "active",
"isSpot": false,
"provisioningType": "virtual-machine",
"gpuSlug": "h100",
"gpusPerNode": 8,
"reservedNodeCount": 1,
"reservedGpuCount": 8,
"startsAt": "2026-10-15T00:00:00Z",
"endsAt": null,
"endReason": null,
"deployedAt": "2026-10-15T00:02:11Z",
"pendingOperation": "stop"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "reservation_relisted",
"message": "End the child reservations before changing their parent reservation."
}
}{
"code": "<string>",
"detail": "<string>"
}Stop a reservation
Ends the reservation now and releases its machines. Ornn revokes SSH access, deletes every VM in the reservation together with its local disk, and releases its Bare Metal hosts. This cannot be undone, and a stopped reservation cannot be activated again. Export local data first; separate storage volumes keep their own lifecycle. For a Spot reservation this is the Stop VM action. A relisted reservation cannot stop while its relisted windows are live. A 202 response means the stop is accepted and Ornn is still releasing the machines; read the reservation until endsAt is set.
curl --request POST \
--url https://api.ornn.com/commerce/reservations/{reservationId}/stop \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ornn.com/commerce/reservations/{reservationId}/stop"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ornn.com/commerce/reservations/{reservationId}/stop', 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/commerce/reservations/{reservationId}/stop",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ornn.com/commerce/reservations/{reservationId}/stop"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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/commerce/reservations/{reservationId}/stop")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/commerce/reservations/{reservationId}/stop")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"reservationId": "11111111-1111-4111-8111-111111111111",
"customerId": "22222222-2222-4222-8222-222222222222",
"status": "completed",
"isSpot": false,
"provisioningType": "virtual-machine",
"gpuSlug": "h100",
"gpusPerNode": 8,
"reservedNodeCount": 1,
"reservedGpuCount": 8,
"startsAt": "2026-10-15T00:00:00Z",
"endsAt": "2026-10-18T09:30:00Z",
"endReason": "stop",
"deployedAt": "2026-10-15T00:02:11Z",
"pendingOperation": null
}{
"reservationId": "11111111-1111-4111-8111-111111111111",
"customerId": "22222222-2222-4222-8222-222222222222",
"status": "active",
"isSpot": false,
"provisioningType": "virtual-machine",
"gpuSlug": "h100",
"gpusPerNode": 8,
"reservedNodeCount": 1,
"reservedGpuCount": 8,
"startsAt": "2026-10-15T00:00:00Z",
"endsAt": null,
"endReason": null,
"deployedAt": "2026-10-15T00:02:11Z",
"pendingOperation": "stop"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "reservation_relisted",
"message": "End the child reservations before changing their parent reservation."
}
}{
"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
Reservation ID.
Response
The reservation has ended and its machines are released.
confirmed, active, completed, cancelled virtual-machine, bare-metal, kubernetes, slurm Your agreed reservation rate in integer micro-USD per GPU-hour, including any fee you pay. Historical reservations without a saved rate show the linked listing term price.
Original agreed duration in hours, separate from operational start and end dates. Renewable reservations retain this duration with a null end date. Null when no duration was agreed.
Whether the reservation contract permits renewal.
Was this page helpful?