curl --request GET \
--url https://data-api.compute-index.com/v2/gpu/rental/transactions/aggregated/history \
--header 'Authorization: Bearer <token>'import requests
url = "https://data-api.compute-index.com/v2/gpu/rental/transactions/aggregated/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/transactions/aggregated/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/transactions/aggregated/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/transactions/aggregated/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/transactions/aggregated/history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data-api.compute-index.com/v2/gpu/rental/transactions/aggregated/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": [
{
"gpu_model": "H100",
"gpu_canonical_name": "nvidia-h100-sxm5-80gb",
"region_group": "US",
"contract_type": "reserved",
"tenor_days": 365,
"price_usd_per_gpu_hour": 2.05,
"total_gpu_count": 1024,
"total_gpu_hours": 8970240,
"transaction_date": "2026-08-14",
"discount_percentage": 24.1,
"is_rolling": true,
"blend_axis": "tenor",
"blend_tenor_days": 123,
"blend_region_group": "<string>",
"row_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"
}Aggregated Transactions: History
Settled GPU deals combined in groups, so no single deal can be identified.
Returns everything that happened inside the range. These are settled events, so this is the only way to read them — there is no current state to ask for.
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 90 days.
curl --request GET \
--url https://data-api.compute-index.com/v2/gpu/rental/transactions/aggregated/history \
--header 'Authorization: Bearer <token>'import requests
url = "https://data-api.compute-index.com/v2/gpu/rental/transactions/aggregated/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/transactions/aggregated/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/transactions/aggregated/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/transactions/aggregated/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/transactions/aggregated/history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data-api.compute-index.com/v2/gpu/rental/transactions/aggregated/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": [
{
"gpu_model": "H100",
"gpu_canonical_name": "nvidia-h100-sxm5-80gb",
"region_group": "US",
"contract_type": "reserved",
"tenor_days": 365,
"price_usd_per_gpu_hour": 2.05,
"total_gpu_count": 1024,
"total_gpu_hours": 8970240,
"transaction_date": "2026-08-14",
"discount_percentage": 24.1,
"is_rolling": true,
"blend_axis": "tenor",
"blend_tenor_days": 123,
"blend_region_group": "<string>",
"row_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"
}total_gpu_count or total_gpu_hours will double-count. is_rolling marks those rows.Every row combines at least two deals, which is why price_usd_per_gpu_hour is the only price
figure: publishing a range alongside it could reveal the individual deals behind it./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/transactions/aggregated/history?start=2026-06-01&end=2026-07-01&gpu_canonical_name=nvidia-h100-sxm5-80gb"
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 90 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.
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"
Region group, exact match — a coarse trading group, NOT a cloud region (see region for those). Values are listed by /metadata.
"us"
Contract type, exact match. Comma-separated list accepted (max 20). Example: ondemand,spot
Only rows whose GPU count >= this value (inclusive).
x >= 0Only rows whose GPU count <= this value (inclusive).
x >= 0Sort field. One of: contract_type, gpu_model, price_usd_per_gpu_hour, region_group, tenor_days, total_gpu_count, transaction_date. Default: transaction_date.
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.