curl --request GET \
--url https://data-api.compute-index.com/v2/gpu/rental/prices/history \
--header 'Authorization: Bearer <token>'import requests
url = "https://data-api.compute-index.com/v2/gpu/rental/prices/history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://data-api.compute-index.com/v2/gpu/rental/prices/history', 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://data-api.compute-index.com/v2/gpu/rental/prices/history",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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://data-api.compute-index.com/v2/gpu/rental/prices/history"
req, _ := http.NewRequest("GET", 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.get("https://data-api.compute-index.com/v2/gpu/rental/prices/history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data-api.compute-index.com/v2/gpu/rental/prices/history")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"vendor": "coreweave",
"vendor_gpu_name": "H100",
"vendor_sku": "<string>",
"vendor_region": "us-east-01",
"region": "us-east",
"gpu_canonical_name": "nvidia-h100-sxm5-80gb",
"gpu_manufacturer": "NVIDIA",
"gpu_model": "H100",
"gpu_count": 8,
"gpu_memory_gb": 80,
"vcpu": 104,
"ram_gb": 1024,
"os": "<string>",
"form_factor": "SXM",
"interconnect": "InfiniBand",
"instance_type": "<string>",
"instance_variant": "<string>",
"contract_type": "ondemand",
"contract_term": "1 year",
"contract_details": "<string>",
"availability": "<string>",
"price_usd_per_gpu_hour": 2.99,
"raw_price": 23.92,
"raw_price_unit": "USD/instance/hr",
"valid_from": "2026-08-01T00:00:00+00:00",
"valid_to": null,
"extracted_at": "2026-08-01T03:00:00+00:00",
"base_product_key": "<string>",
"product_key": "<string>"
}
],
"meta": {
"page_size": 100,
"returned": 100,
"has_more": true,
"next": {
"path": "/v2/gpu/rental/prices/history",
"query_params": {
"page_size": "100",
"page_token": "eyJkIjoicHJpY2VzIiwiZSI6Imhpc3RvcnkiLC4uLg.qgLm5w"
},
"url": "https://data-api.compute-index.com/v2/gpu/rental/prices/history?page_token=eyJkIjoicHJpY2VzIiwiZSI6Imhpc3RvcnksLi4u.qgLm5w&page_size=100"
},
"sort": {
"by": "valid_from",
"order": "desc"
},
"window": {
"start": "2026-06-01T00:00:00+00:00",
"end": "2026-07-01T00:00:00+00:00",
"clamped": true,
"history_starts_at": "<string>"
}
}
}{
"status": 401,
"title": "Unauthorized",
"detail": "Missing or invalid bearer token.",
"code": "unauthenticated",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}{
"status": 403,
"title": "Forbidden",
"detail": "The token does not carry the scopes this endpoint requires.",
"code": "insufficient_entitlement",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}{
"status": 404,
"title": "Not Found",
"detail": "No such resource, or none you are entitled to see.",
"code": "not_found",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}{
"status": 422,
"title": "Unprocessable Content",
"detail": "A parameter failed validation.",
"code": "validation_failed",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}{
"status": 429,
"title": "Too Many Requests",
"detail": "Rate limit exceeded; see the X-RateLimit-* headers.",
"code": "rate_limited",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}GPU Rental Prices: History
Vendor prices for renting GPU compute, in USD per GPU-hour.
Returns the records that changed inside the range, so asking for yesterday gives you yesterday’s changes rather than everything still in force.
start is included and end is not, so consecutive ranges join up without returning anything twice. A plain date for end means the end of that day, so start=2026-06-01&end=2026-06-01 is that whole day.
Omitting start gives you the most recent 30 days.
curl --request GET \
--url https://data-api.compute-index.com/v2/gpu/rental/prices/history \
--header 'Authorization: Bearer <token>'import requests
url = "https://data-api.compute-index.com/v2/gpu/rental/prices/history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://data-api.compute-index.com/v2/gpu/rental/prices/history', 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://data-api.compute-index.com/v2/gpu/rental/prices/history",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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://data-api.compute-index.com/v2/gpu/rental/prices/history"
req, _ := http.NewRequest("GET", 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.get("https://data-api.compute-index.com/v2/gpu/rental/prices/history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data-api.compute-index.com/v2/gpu/rental/prices/history")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"vendor": "coreweave",
"vendor_gpu_name": "H100",
"vendor_sku": "<string>",
"vendor_region": "us-east-01",
"region": "us-east",
"gpu_canonical_name": "nvidia-h100-sxm5-80gb",
"gpu_manufacturer": "NVIDIA",
"gpu_model": "H100",
"gpu_count": 8,
"gpu_memory_gb": 80,
"vcpu": 104,
"ram_gb": 1024,
"os": "<string>",
"form_factor": "SXM",
"interconnect": "InfiniBand",
"instance_type": "<string>",
"instance_variant": "<string>",
"contract_type": "ondemand",
"contract_term": "1 year",
"contract_details": "<string>",
"availability": "<string>",
"price_usd_per_gpu_hour": 2.99,
"raw_price": 23.92,
"raw_price_unit": "USD/instance/hr",
"valid_from": "2026-08-01T00:00:00+00:00",
"valid_to": null,
"extracted_at": "2026-08-01T03:00:00+00:00",
"base_product_key": "<string>",
"product_key": "<string>"
}
],
"meta": {
"page_size": 100,
"returned": 100,
"has_more": true,
"next": {
"path": "/v2/gpu/rental/prices/history",
"query_params": {
"page_size": "100",
"page_token": "eyJkIjoicHJpY2VzIiwiZSI6Imhpc3RvcnkiLC4uLg.qgLm5w"
},
"url": "https://data-api.compute-index.com/v2/gpu/rental/prices/history?page_token=eyJkIjoicHJpY2VzIiwiZSI6Imhpc3RvcnksLi4u.qgLm5w&page_size=100"
},
"sort": {
"by": "valid_from",
"order": "desc"
},
"window": {
"start": "2026-06-01T00:00:00+00:00",
"end": "2026-07-01T00:00:00+00:00",
"clamped": true,
"history_starts_at": "<string>"
}
}
}{
"status": 401,
"title": "Unauthorized",
"detail": "Missing or invalid bearer token.",
"code": "unauthenticated",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}{
"status": 403,
"title": "Forbidden",
"detail": "The token does not carry the scopes this endpoint requires.",
"code": "insufficient_entitlement",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}{
"status": 404,
"title": "Not Found",
"detail": "No such resource, or none you are entitled to see.",
"code": "not_found",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}{
"status": 422,
"title": "Unprocessable Content",
"detail": "A parameter failed validation.",
"code": "validation_failed",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}{
"status": 429,
"title": "Too Many Requests",
"detail": "Rate limit exceeded; see the X-RateLimit-* headers.",
"code": "rate_limited",
"request_id": "01JQ2X8N4T6V9WZ0ABCD"
}vendor, gpu_canonical_name, gpu_search,
base_product_key or product_key. Without one the request is refused with 400 missing_anchor.
region and contract_type narrow an anchored query; they cannot anchor it on their own./metadata lists every value you can use./metadata as
history_starts_at.meta.next until it is null, and send nothing alongside it — the
link already carries your filters, dates and ordering. See
Paging.Example
curl -H "Authorization: Bearer $TOKEN" \
"https://data-api.compute-index.com/v2/gpu/rental/prices/history?start=2026-06-01&end=2026-07-01&gpu_search=H100&vendor=aws"
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Window start, inclusive (ISO 8601 datetime, or a bare date = start of that day UTC). Default: end minus 30 days.
Window end, exclusive (ISO 8601 datetime, or a bare date = that whole day, i.e. the bound becomes the following midnight UTC). Default: now. Consecutive windows tile with no overlap: start=2026-06-01&end=2026-06-07 then start=2026-06-08&end=2026-06-14.
Vendor slug, exact match. Comma-separated list accepted (max 20). Example: aws,coreweave
"aws"
Canonical GPU name, exact match — the catalog slug form. Comma-separated list accepted (max 20). Values are listed by the data type's /metadata endpoint.
"nvidia-h100-sxm5-80gb"
GPU model as free text, resolved server-side into gpu_canonical_name values. Matched as a substring against the GPU names and the vendor spellings listed by /v2/gpu/rental/prices/metadata, ignoring case, spaces and punctuation — H100, h 100 and h-100 are the same search. Spellings cover the whole history of each GPU, not just its current listings, so a discontinued name still resolves on /history and /as-of. Counts as an anchor. Comma-separated list accepted (max 20 terms); a row matching any term is returned. A search resolving to more than 20 GPUs is refused rather than expanded — name the ones you want with gpu_canonical_name instead, which /v2/gpu/rental/prices/metadata lists in full.
"H100"
Region, exact match. Comma-separated list accepted (max 20). Example: us-east-1
Contract type, exact match. Comma-separated list accepted (max 20). Example: ondemand,spot
Identity hash: every observation of one priced thing over time, across price changes. Obtain it from a previous response — it is the natural anchor for history drill-down.
Snapshot identity hash: one exact observation (identity + time + price).
Availability status, exact match (single value). Example: available
Only rows with price_usd_per_gpu_hour >= this value (inclusive).
x >= 0Only rows with price_usd_per_gpu_hour <= this value (inclusive).
x >= 0Only rows whose GPU count >= this value (inclusive).
x >= 0Only rows whose GPU count <= this value (inclusive).
x >= 0Only rows with gpu_memory_gb >= this value (inclusive).
x >= 0Only rows with gpu_memory_gb <= this value (inclusive).
x >= 0Sort field. One of: gpu_canonical_name, gpu_count, gpu_memory_gb, price_usd_per_gpu_hour, region, valid_from, vendor. Default: valid_from.
Sort direction: asc or desc. Default: desc.
Rows per page (max 1000).
1 <= x <= 1000Opaque token token from a previous response's meta.next. It carries the whole request — filters, ordering, window and position — so supply it alone; the only parameter that may accompany it is page_size. Do not construct or parse these; the format is not part of the contract.