curl "https://api.ornnai.com/api/forward" \
-H "Authorization: Bearer YOUR_API_KEY"import requests
payload = requests.get(
"https://api.ornnai.com/api/forward",
headers={"Authorization": "Bearer YOUR_API_KEY"},
).json()
for curve in payload["data"]:
for point in curve["data"]:
print(curve["name"], point["label"], point["price"])
const res = await fetch("https://api.ornnai.com/api/forward", {
headers: { Authorization: "Bearer YOUR_API_KEY" },
});
const { data, suppressed, asOf } = await res.json();
<?php
$ch = curl_init("https://api.ornnai.com/api/forward");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer YOUR_API_KEY"],
]);
$data = json_decode(curl_exec($ch), true);
package main
import (
"io"
"net/http"
)
func main() {
endpoint := "https://api.ornnai.com/api/forward"
req, _ := http.NewRequest("GET", endpoint, nil)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
_ = body
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(
URI.create("https://api.ornnai.com/api/forward"))
.header("Authorization", "Bearer YOUR_API_KEY")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
require "net/http"
require "json"
uri = URI("https://api.ornnai.com/api/forward")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer YOUR_API_KEY"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
{
"success": true,
"asOf": "2026-08-19T00:00:00.000Z",
"data": [
{
"name": "H100 SXM",
"data": [
{
"label": "1M",
"months": 1,
"price": 2.44,
"has_mark": true,
"provenance": {
"source": "hand_entered_mark",
"updated_at": "2026-08-19T00:00:00.000Z",
"sample_count": null
},
"as_of_date": "2026-08-19T00:00:00.000Z",
"insufficient_data": null
},
{
"label": "6M",
"months": 6,
"price": null,
"has_mark": false,
"provenance": null,
"as_of_date": null,
"insufficient_data": "no_observation"
}
]
}
],
"suppressed": [
{
"name": "GB200",
"data": [
{
"label": "1M",
"months": 1,
"price": null,
"has_mark": false,
"provenance": null,
"as_of_date": null,
"insufficient_data": "no_observation"
}
]
}
]
}{
"error": "Unauthorized",
"message": "API key required. Use Authorization: Bearer YOUR_API_KEY"
}Get the published forward curve
The published GPU forward curve: current marks only. A sk_prem_ key receives five curves (H100 SXM, H200, A100 SXM4, B200, RTX PRO 6000 WS). B300, GB200, and GB300 require a Full / Enterprise sk_live_ key. data carries the curves with at least one published mark; suppressed carries fully unmarked curves, whose points have a null price and a machine-readable insufficient_data reason. Each published point includes provenance and its mark edit or publish time, and asOf is the most recent mark timestamp in the response. Marks are hand-published rather than settled on a cadence, so responses change only when a mark does. Historical marks are not available on the customer API.
curl "https://api.ornnai.com/api/forward" \
-H "Authorization: Bearer YOUR_API_KEY"import requests
payload = requests.get(
"https://api.ornnai.com/api/forward",
headers={"Authorization": "Bearer YOUR_API_KEY"},
).json()
for curve in payload["data"]:
for point in curve["data"]:
print(curve["name"], point["label"], point["price"])
const res = await fetch("https://api.ornnai.com/api/forward", {
headers: { Authorization: "Bearer YOUR_API_KEY" },
});
const { data, suppressed, asOf } = await res.json();
<?php
$ch = curl_init("https://api.ornnai.com/api/forward");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer YOUR_API_KEY"],
]);
$data = json_decode(curl_exec($ch), true);
package main
import (
"io"
"net/http"
)
func main() {
endpoint := "https://api.ornnai.com/api/forward"
req, _ := http.NewRequest("GET", endpoint, nil)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
_ = body
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(
URI.create("https://api.ornnai.com/api/forward"))
.header("Authorization", "Bearer YOUR_API_KEY")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
require "net/http"
require "json"
uri = URI("https://api.ornnai.com/api/forward")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer YOUR_API_KEY"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
{
"success": true,
"asOf": "2026-08-19T00:00:00.000Z",
"data": [
{
"name": "H100 SXM",
"data": [
{
"label": "1M",
"months": 1,
"price": 2.44,
"has_mark": true,
"provenance": {
"source": "hand_entered_mark",
"updated_at": "2026-08-19T00:00:00.000Z",
"sample_count": null
},
"as_of_date": "2026-08-19T00:00:00.000Z",
"insufficient_data": null
},
{
"label": "6M",
"months": 6,
"price": null,
"has_mark": false,
"provenance": null,
"as_of_date": null,
"insufficient_data": "no_observation"
}
]
}
],
"suppressed": [
{
"name": "GB200",
"data": [
{
"label": "1M",
"months": 1,
"price": null,
"has_mark": false,
"provenance": null,
"as_of_date": null,
"insufficient_data": "no_observation"
}
]
}
]
}{
"error": "Unauthorized",
"message": "API key required. Use Authorization: Bearer YOUR_API_KEY"
}Overview
The published GPU forward curve: current marks only. Ask_prem_ key receives the five standard curves (H100 SXM, H200, A100 SXM4, B200, RTX PRO 6000 WS). B300, GB200, and GB300 require a Full / Enterprise key (sk_live_). data carries the curves with at least one published mark; suppressed carries the fully unmarked curves, whose points have a null price and a machine-readable insufficient_data reason - the service never interpolates, carries forward, or fills a missing mark with a default. Each published point includes provenance and its mark edit or publish time, and asOf is the most recent mark timestamp in the response.
Each price is a term mark: the flat reserved-contract rate of that tenor. The implied forward is not a separate API field; it is those term contracts layered (the leftover rate between neighbouring tenors). How that layering is written down, and that the curve does not adjust reserved quotes for financing or other commitment discounts, is on Forward Curves.
Marks are hand-published rather than settled on a cadence, so responses change only when a mark does. Historical marks are not available on the customer API. Requires an API key - there is no free tier; the website catalog shows the curve products without a marks API.Authorizations
API key passed as a Bearer token. Create one in the dashboard.
Response
Published curves, suppressed coverage, and the freshest mark timestamp.

