curl --request POST \
--url https://api.ornn.com/commerce/reservations/{reservationId}/relist \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"startsAt": "2026-10-20T00:00:00Z",
"endsAt": "2026-11-03T00:00:00Z",
"nodeCount": 2,
"nodeIds": [
"33333333-3333-4333-8333-333333333333",
"12121212-1212-4212-8212-121212121212"
],
"terms": [
{
"type": "reserved",
"minDurationHours": 24,
"maxDurationHours": 336,
"pricePerGpuHourMicroUsd": 4000000,
"downPaymentCents": null,
"renewable": false
}
]
}
'import requests
url = "https://api.ornn.com/commerce/reservations/{reservationId}/relist"
payload = {
"startsAt": "2026-10-20T00:00:00Z",
"endsAt": "2026-11-03T00:00:00Z",
"nodeCount": 2,
"nodeIds": ["33333333-3333-4333-8333-333333333333", "12121212-1212-4212-8212-121212121212"],
"terms": [
{
"type": "reserved",
"minDurationHours": 24,
"maxDurationHours": 336,
"pricePerGpuHourMicroUsd": 4000000,
"downPaymentCents": None,
"renewable": False
}
]
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
startsAt: '2026-10-20T00:00:00Z',
endsAt: '2026-11-03T00:00:00Z',
nodeCount: 2,
nodeIds: ['33333333-3333-4333-8333-333333333333', '12121212-1212-4212-8212-121212121212'],
terms: [
{
type: 'reserved',
minDurationHours: 24,
maxDurationHours: 336,
pricePerGpuHourMicroUsd: 4000000,
downPaymentCents: null,
renewable: false
}
]
})
};
fetch('https://api.ornn.com/commerce/reservations/{reservationId}/relist', 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}/relist",
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([
'startsAt' => '2026-10-20T00:00:00Z',
'endsAt' => '2026-11-03T00:00:00Z',
'nodeCount' => 2,
'nodeIds' => [
'33333333-3333-4333-8333-333333333333',
'12121212-1212-4212-8212-121212121212'
],
'terms' => [
[
'type' => 'reserved',
'minDurationHours' => 24,
'maxDurationHours' => 336,
'pricePerGpuHourMicroUsd' => 4000000,
'downPaymentCents' => null,
'renewable' => false
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/commerce/reservations/{reservationId}/relist"
payload := strings.NewReader("{\n \"startsAt\": \"2026-10-20T00:00:00Z\",\n \"endsAt\": \"2026-11-03T00:00:00Z\",\n \"nodeCount\": 2,\n \"nodeIds\": [\n \"33333333-3333-4333-8333-333333333333\",\n \"12121212-1212-4212-8212-121212121212\"\n ],\n \"terms\": [\n {\n \"type\": \"reserved\",\n \"minDurationHours\": 24,\n \"maxDurationHours\": 336,\n \"pricePerGpuHourMicroUsd\": 4000000,\n \"downPaymentCents\": null,\n \"renewable\": false\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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/commerce/reservations/{reservationId}/relist")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"startsAt\": \"2026-10-20T00:00:00Z\",\n \"endsAt\": \"2026-11-03T00:00:00Z\",\n \"nodeCount\": 2,\n \"nodeIds\": [\n \"33333333-3333-4333-8333-333333333333\",\n \"12121212-1212-4212-8212-121212121212\"\n ],\n \"terms\": [\n {\n \"type\": \"reserved\",\n \"minDurationHours\": 24,\n \"maxDurationHours\": 336,\n \"pricePerGpuHourMicroUsd\": 4000000,\n \"downPaymentCents\": null,\n \"renewable\": false\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/commerce/reservations/{reservationId}/relist")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"startsAt\": \"2026-10-20T00:00:00Z\",\n \"endsAt\": \"2026-11-03T00:00:00Z\",\n \"nodeCount\": 2,\n \"nodeIds\": [\n \"33333333-3333-4333-8333-333333333333\",\n \"12121212-1212-4212-8212-121212121212\"\n ],\n \"terms\": [\n {\n \"type\": \"reserved\",\n \"minDurationHours\": 24,\n \"maxDurationHours\": 336,\n \"pricePerGpuHourMicroUsd\": 4000000,\n \"downPaymentCents\": null,\n \"renewable\": false\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"listing": {
"capacityListingId": "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee",
"listingNumber": 1188,
"parentReservationId": "11111111-1111-4111-8111-111111111111",
"kind": "secondary",
"state": "available",
"gpuSlug": "nvidia_h100_sxm",
"gpusPerNode": 8,
"capacityNodeCount": 2,
"facilityId": "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
"provisioningType": "virtual-machine",
"availableAt": "2026-10-20T00:00:00Z",
"availableUntil": "2026-11-03T00:00:00Z",
"daysToRfs": null,
"cpu": "2x 56-core x86",
"ram": "2 TB",
"storage": "8x 3.84 TB NVMe",
"fabricType": "InfiniBand 3.2 Tbps",
"internet": "10 Gbps",
"createdAt": "2026-10-14T18:30:00Z",
"updatedAt": "2026-10-14T18:30:00Z"
},
"terms": [
{
"listingTermsId": "13131313-1313-4313-8313-131313131313",
"capacityListingId": "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee",
"type": "reserved",
"renewable": false,
"minDurationHours": 24,
"maxDurationHours": 336,
"downPaymentCents": null,
"pricePerGpuHourMicroUsd": 4000000,
"createdAt": "2026-10-14T18:30:00Z"
}
]
}{
"detail": {
"code": "invalid_id",
"message": "That capacity or financial term ID is not valid."
}
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "forbidden",
"message": "Your account cannot make this change."
}
}{
"detail": {
"code": "reservation_not_found",
"message": "Ornn could not find that reservation."
}
}{
"detail": {
"code": "relist_nodes_unavailable",
"message": "A selected node is already listed or reserved during these dates. Choose other nodes or dates."
}
}{
"detail": {
"code": "invalid_relist",
"message": "The relist must fit within the parent reservation's dates and node count."
}
}{
"code": "<string>",
"detail": "<string>"
}Relist capacity from a reservation
Creates a listing that sells whole nodes from a reservation your organization holds, at your asking price, and puts it on sale immediately. Your reservation and its billing continue; buyers never see who relisted the capacity.
Read the reservation first: relistableNodeCount, relistableNodeIds, and relistUnavailableReason describe what you can relist. The window must fit inside the reservation. An end may be null or omitted only when the source has no committed expiry; renewable reservations, including month-to-month contracts, cannot be relisted even if they have a scheduled end. Use a reserved term to sell windows in the Market (set minDurationHours to the shortest rental you accept and maxDurationHours no longer than the window), or a spot term (1 hour, renewable) to offer VM capacity on the Spot order book. You can relist the same reservation again as long as no two live relists cover the same node at the same time. Spot and On-demand reservations cannot be relisted.
Requires Idempotency-Key. Publication to the Market and Spot follows within moments of the response.
curl --request POST \
--url https://api.ornn.com/commerce/reservations/{reservationId}/relist \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"startsAt": "2026-10-20T00:00:00Z",
"endsAt": "2026-11-03T00:00:00Z",
"nodeCount": 2,
"nodeIds": [
"33333333-3333-4333-8333-333333333333",
"12121212-1212-4212-8212-121212121212"
],
"terms": [
{
"type": "reserved",
"minDurationHours": 24,
"maxDurationHours": 336,
"pricePerGpuHourMicroUsd": 4000000,
"downPaymentCents": null,
"renewable": false
}
]
}
'import requests
url = "https://api.ornn.com/commerce/reservations/{reservationId}/relist"
payload = {
"startsAt": "2026-10-20T00:00:00Z",
"endsAt": "2026-11-03T00:00:00Z",
"nodeCount": 2,
"nodeIds": ["33333333-3333-4333-8333-333333333333", "12121212-1212-4212-8212-121212121212"],
"terms": [
{
"type": "reserved",
"minDurationHours": 24,
"maxDurationHours": 336,
"pricePerGpuHourMicroUsd": 4000000,
"downPaymentCents": None,
"renewable": False
}
]
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
startsAt: '2026-10-20T00:00:00Z',
endsAt: '2026-11-03T00:00:00Z',
nodeCount: 2,
nodeIds: ['33333333-3333-4333-8333-333333333333', '12121212-1212-4212-8212-121212121212'],
terms: [
{
type: 'reserved',
minDurationHours: 24,
maxDurationHours: 336,
pricePerGpuHourMicroUsd: 4000000,
downPaymentCents: null,
renewable: false
}
]
})
};
fetch('https://api.ornn.com/commerce/reservations/{reservationId}/relist', 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}/relist",
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([
'startsAt' => '2026-10-20T00:00:00Z',
'endsAt' => '2026-11-03T00:00:00Z',
'nodeCount' => 2,
'nodeIds' => [
'33333333-3333-4333-8333-333333333333',
'12121212-1212-4212-8212-121212121212'
],
'terms' => [
[
'type' => 'reserved',
'minDurationHours' => 24,
'maxDurationHours' => 336,
'pricePerGpuHourMicroUsd' => 4000000,
'downPaymentCents' => null,
'renewable' => false
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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/commerce/reservations/{reservationId}/relist"
payload := strings.NewReader("{\n \"startsAt\": \"2026-10-20T00:00:00Z\",\n \"endsAt\": \"2026-11-03T00:00:00Z\",\n \"nodeCount\": 2,\n \"nodeIds\": [\n \"33333333-3333-4333-8333-333333333333\",\n \"12121212-1212-4212-8212-121212121212\"\n ],\n \"terms\": [\n {\n \"type\": \"reserved\",\n \"minDurationHours\": 24,\n \"maxDurationHours\": 336,\n \"pricePerGpuHourMicroUsd\": 4000000,\n \"downPaymentCents\": null,\n \"renewable\": false\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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/commerce/reservations/{reservationId}/relist")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"startsAt\": \"2026-10-20T00:00:00Z\",\n \"endsAt\": \"2026-11-03T00:00:00Z\",\n \"nodeCount\": 2,\n \"nodeIds\": [\n \"33333333-3333-4333-8333-333333333333\",\n \"12121212-1212-4212-8212-121212121212\"\n ],\n \"terms\": [\n {\n \"type\": \"reserved\",\n \"minDurationHours\": 24,\n \"maxDurationHours\": 336,\n \"pricePerGpuHourMicroUsd\": 4000000,\n \"downPaymentCents\": null,\n \"renewable\": false\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/commerce/reservations/{reservationId}/relist")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"startsAt\": \"2026-10-20T00:00:00Z\",\n \"endsAt\": \"2026-11-03T00:00:00Z\",\n \"nodeCount\": 2,\n \"nodeIds\": [\n \"33333333-3333-4333-8333-333333333333\",\n \"12121212-1212-4212-8212-121212121212\"\n ],\n \"terms\": [\n {\n \"type\": \"reserved\",\n \"minDurationHours\": 24,\n \"maxDurationHours\": 336,\n \"pricePerGpuHourMicroUsd\": 4000000,\n \"downPaymentCents\": null,\n \"renewable\": false\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"listing": {
"capacityListingId": "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee",
"listingNumber": 1188,
"parentReservationId": "11111111-1111-4111-8111-111111111111",
"kind": "secondary",
"state": "available",
"gpuSlug": "nvidia_h100_sxm",
"gpusPerNode": 8,
"capacityNodeCount": 2,
"facilityId": "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
"provisioningType": "virtual-machine",
"availableAt": "2026-10-20T00:00:00Z",
"availableUntil": "2026-11-03T00:00:00Z",
"daysToRfs": null,
"cpu": "2x 56-core x86",
"ram": "2 TB",
"storage": "8x 3.84 TB NVMe",
"fabricType": "InfiniBand 3.2 Tbps",
"internet": "10 Gbps",
"createdAt": "2026-10-14T18:30:00Z",
"updatedAt": "2026-10-14T18:30:00Z"
},
"terms": [
{
"listingTermsId": "13131313-1313-4313-8313-131313131313",
"capacityListingId": "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee",
"type": "reserved",
"renewable": false,
"minDurationHours": 24,
"maxDurationHours": 336,
"downPaymentCents": null,
"pricePerGpuHourMicroUsd": 4000000,
"createdAt": "2026-10-14T18:30:00Z"
}
]
}{
"detail": {
"code": "invalid_id",
"message": "That capacity or financial term ID is not valid."
}
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "forbidden",
"message": "Your account cannot make this change."
}
}{
"detail": {
"code": "reservation_not_found",
"message": "Ornn could not find that reservation."
}
}{
"detail": {
"code": "relist_nodes_unavailable",
"message": "A selected node is already listed or reserved during these dates. Choose other nodes or dates."
}
}{
"detail": {
"code": "invalid_relist",
"message": "The relist must fit within the parent reservation's dates and node count."
}
}{
"code": "<string>",
"detail": "<string>"
}ornn capacity-offers relist --reservation-id <reservation-id> --node-count <count> --starts-at <time> --ends-at <time> --terms '<json>' --yes. Pass --idempotency-key to make a retry safe.
Read the reservation with Get a reservation first to check relistableNodeCount and the relistable node IDs. See Relist capacity.Authorizations
Create an organization API key in Account Settings > Developer. Do not send this key to the Kubernetes API server.
Headers
Required. A unique key of 1 to 200 bytes for this operation, such as a UUID. Retrying with the same key and the same body returns the original response instead of writing again. The key is remembered for 24 hours; reusing it with a different body returns 409 idempotency_conflict. A missing key returns 422 invalid_idempotency_key.
1 - 200Path Parameters
A reservation your organization holds.
Body
Whole-second start, no earlier than the reservation's start.
Whole nodes to relist, up to the reservation's relistableNodeCount.
x >= 11Show child attributes
Show child attributes
Whole-second end after startsAt, no later than the source reservation's committed expiry. Null or omission means no scheduled end and is allowed only when the source has no committed expiry.
Optional. Exactly nodeCount distinct IDs from the reservation's relistableNodeIds. Omit nodeIds to let Ornn choose free assigned nodes.
Was this page helpful?