curl --request POST \
--url https://api.ornn.com/v1/markets/schedules/{listingId}/offers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"listingTermId": "88888888-8888-4888-8888-888888888888",
"durationSeconds": 2592000,
"pricePerGpuHourMicroUsd": 2400000,
"downPaymentCents": 500000
}
'import requests
url = "https://api.ornn.com/v1/markets/schedules/{listingId}/offers"
payload = {
"listingTermId": "88888888-8888-4888-8888-888888888888",
"durationSeconds": 2592000,
"pricePerGpuHourMicroUsd": 2400000,
"downPaymentCents": 500000
}
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({
listingTermId: '88888888-8888-4888-8888-888888888888',
durationSeconds: 2592000,
pricePerGpuHourMicroUsd: 2400000,
downPaymentCents: 500000
})
};
fetch('https://api.ornn.com/v1/markets/schedules/{listingId}/offers', 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/markets/schedules/{listingId}/offers",
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([
'listingTermId' => '88888888-8888-4888-8888-888888888888',
'durationSeconds' => 2592000,
'pricePerGpuHourMicroUsd' => 2400000,
'downPaymentCents' => 500000
]),
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/v1/markets/schedules/{listingId}/offers"
payload := strings.NewReader("{\n \"listingTermId\": \"88888888-8888-4888-8888-888888888888\",\n \"durationSeconds\": 2592000,\n \"pricePerGpuHourMicroUsd\": 2400000,\n \"downPaymentCents\": 500000\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/v1/markets/schedules/{listingId}/offers")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"listingTermId\": \"88888888-8888-4888-8888-888888888888\",\n \"durationSeconds\": 2592000,\n \"pricePerGpuHourMicroUsd\": 2400000,\n \"downPaymentCents\": 500000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/markets/schedules/{listingId}/offers")
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 \"listingTermId\": \"88888888-8888-4888-8888-888888888888\",\n \"durationSeconds\": 2592000,\n \"pricePerGpuHourMicroUsd\": 2400000,\n \"downPaymentCents\": 500000\n}"
response = http.request(request)
puts response.read_body{
"offer": {
"offerId": "99999999-9999-4999-8999-999999999999",
"listingId": "77777777-7777-4777-8777-777777777777",
"listingTermId": "88888888-8888-4888-8888-888888888888",
"startsAt": "2026-10-15T00:00:00.000Z",
"endsAt": "2026-11-14T00:00:00.000Z",
"pricePerGpuHourMicroUsd": 2400000,
"downPaymentCents": 500000,
"status": "open",
"cancelReason": null,
"createdAt": "2026-10-14T18:30:00.000Z",
"acceptedAt": null,
"isMine": true,
"onMyListing": false
}
}{
"offer": {
"offerId": "99999999-9999-4999-8999-999999999999",
"listingId": "77777777-7777-4777-8777-777777777777",
"listingTermId": "88888888-8888-4888-8888-888888888888",
"startsAt": "2026-10-15T00:00:00.000Z",
"endsAt": "2026-11-14T00:00:00.000Z",
"pricePerGpuHourMicroUsd": 2400000,
"downPaymentCents": 500000,
"status": "open",
"cancelReason": null,
"createdAt": "2026-10-14T18:30:00.000Z",
"acceptedAt": null,
"isMine": true,
"onMyListing": false
}
}{
"detail": {
"code": "idempotency_key_required",
"message": "Send an Idempotency-Key header with this request."
}
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "cannot_offer_on_own_listing",
"message": "You cannot make an offer on your own listing."
}
}{
"detail": {
"code": "schedule_not_found",
"message": "Ornn could not find that listing."
}
}{
"detail": {
"code": "window_unavailable",
"message": "Part of this window is already reserved."
}
}{
"detail": {
"code": "invalid_listing_term",
"message": "Choose an available listing term."
}
}{
"code": "<string>",
"detail": "<string>"
}Post a Reserve offer
Offers a price for a whole Reserve listing: every node, starting at the later of the listing’s start and now, for the chosen duration. The listing owner accepts or declines. Your organization must be approved.
When the listing has terms, send listingTermId for a reserved term and durationSeconds within its bounds (optional when the minimum equals the maximum). The offer is open until it is accepted, you cancel it, or another trade takes the window. Relisted (Market) capacity does not take offers.
Requires Idempotency-Key.
curl --request POST \
--url https://api.ornn.com/v1/markets/schedules/{listingId}/offers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"listingTermId": "88888888-8888-4888-8888-888888888888",
"durationSeconds": 2592000,
"pricePerGpuHourMicroUsd": 2400000,
"downPaymentCents": 500000
}
'import requests
url = "https://api.ornn.com/v1/markets/schedules/{listingId}/offers"
payload = {
"listingTermId": "88888888-8888-4888-8888-888888888888",
"durationSeconds": 2592000,
"pricePerGpuHourMicroUsd": 2400000,
"downPaymentCents": 500000
}
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({
listingTermId: '88888888-8888-4888-8888-888888888888',
durationSeconds: 2592000,
pricePerGpuHourMicroUsd: 2400000,
downPaymentCents: 500000
})
};
fetch('https://api.ornn.com/v1/markets/schedules/{listingId}/offers', 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/markets/schedules/{listingId}/offers",
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([
'listingTermId' => '88888888-8888-4888-8888-888888888888',
'durationSeconds' => 2592000,
'pricePerGpuHourMicroUsd' => 2400000,
'downPaymentCents' => 500000
]),
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/v1/markets/schedules/{listingId}/offers"
payload := strings.NewReader("{\n \"listingTermId\": \"88888888-8888-4888-8888-888888888888\",\n \"durationSeconds\": 2592000,\n \"pricePerGpuHourMicroUsd\": 2400000,\n \"downPaymentCents\": 500000\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/v1/markets/schedules/{listingId}/offers")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"listingTermId\": \"88888888-8888-4888-8888-888888888888\",\n \"durationSeconds\": 2592000,\n \"pricePerGpuHourMicroUsd\": 2400000,\n \"downPaymentCents\": 500000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ornn.com/v1/markets/schedules/{listingId}/offers")
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 \"listingTermId\": \"88888888-8888-4888-8888-888888888888\",\n \"durationSeconds\": 2592000,\n \"pricePerGpuHourMicroUsd\": 2400000,\n \"downPaymentCents\": 500000\n}"
response = http.request(request)
puts response.read_body{
"offer": {
"offerId": "99999999-9999-4999-8999-999999999999",
"listingId": "77777777-7777-4777-8777-777777777777",
"listingTermId": "88888888-8888-4888-8888-888888888888",
"startsAt": "2026-10-15T00:00:00.000Z",
"endsAt": "2026-11-14T00:00:00.000Z",
"pricePerGpuHourMicroUsd": 2400000,
"downPaymentCents": 500000,
"status": "open",
"cancelReason": null,
"createdAt": "2026-10-14T18:30:00.000Z",
"acceptedAt": null,
"isMine": true,
"onMyListing": false
}
}{
"offer": {
"offerId": "99999999-9999-4999-8999-999999999999",
"listingId": "77777777-7777-4777-8777-777777777777",
"listingTermId": "88888888-8888-4888-8888-888888888888",
"startsAt": "2026-10-15T00:00:00.000Z",
"endsAt": "2026-11-14T00:00:00.000Z",
"pricePerGpuHourMicroUsd": 2400000,
"downPaymentCents": 500000,
"status": "open",
"cancelReason": null,
"createdAt": "2026-10-14T18:30:00.000Z",
"acceptedAt": null,
"isMine": true,
"onMyListing": false
}
}{
"detail": {
"code": "idempotency_key_required",
"message": "Send an Idempotency-Key header with this request."
}
}{
"code": "<string>",
"detail": "<string>"
}{
"detail": {
"code": "cannot_offer_on_own_listing",
"message": "You cannot make an offer on your own listing."
}
}{
"detail": {
"code": "schedule_not_found",
"message": "Ornn could not find that listing."
}
}{
"detail": {
"code": "window_unavailable",
"message": "Part of this window is already reserved."
}
}{
"detail": {
"code": "invalid_listing_term",
"message": "Choose an available listing term."
}
}{
"code": "<string>",
"detail": "<string>"
}Idempotency-Key for each offer and reuse it only to retry that same request.
ornn offers post does not send a term or duration, so it works only on listings without terms. Use this endpoint for listings with terms. See Reserve GPU 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 characters for this operation, such as a UUID. Retrying with the same key and the same body returns the original result with HTTP 200 instead of creating a second one. The key is remembered for 24 hours per organization; reusing it for a different request returns 409 idempotency_conflict. A missing key returns 400 idempotency_key_required.
1 - 200Path Parameters
Listing ID (capacityListingId or listingId).
Body
Your offer per GPU-hour in integer micro-USD. It can be below or above the term price.
x >= 1Required when the listing has terms. Choose a reserved term.
Whole seconds within the term's minDurationSeconds and maxDurationSeconds. Required unless the term's minimum equals its maximum.
x >= 1The down payment you offer, in whole cents. Omitted means 0. The console sends the selected term's downPaymentCents.
x >= 0Response
A retry with the same Idempotency-Key and body; returns the original offer.
Show child attributes
Show child attributes
Was this page helpful?