curl --request GET \
--url https://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries', 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.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries",
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://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries"
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://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries")
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": [
{
"timestamp": "2023-11-07T05:31:56Z",
"tvl": {
"usd": "<string>"
},
"apy_30d": 123,
"apy_7d": 123,
"apy_90d": 123,
"unit_price": "<string>",
"total_supply": "<string>"
}
],
"meta": {
"count": 123,
"limit": 123,
"refreshed_at": "2023-11-07T05:31:56Z",
"request_id": "<string>",
"end": "2023-11-07T05:31:56Z",
"next_cursor": "<string>",
"partial_errors": [
{
"code": "<string>",
"message": "<string>",
"resource_id": "<string>"
}
],
"resolved_vault_id": "<string>",
"start": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}Get vault history by slug
Returns USD TVL and outstanding share supply summed across every currently linked deployment of an enabled logical vault, including hidden vaults. Uses UTC-aligned snapshots and timestamp pagination. A deployment contributes zero before its indexed creation time; after creation, missing snapshots or USD prices produce null TVL, never a partial sum. Does not carry values forward. Missing supply or a missing snapshot after deployment creation produces null total_supply, independent of USD price availability. APY and unit_price come from the Admin-selected primary deployment at the same timestamp, identified by meta.resolved_vault_id. Missing primary snapshots yield null primary metrics; APY respects Admin visibility. TVL is USD-only because deployment numeraires may differ; native TVL remains available on the primary/per-deployment endpoints. This is a sum of deployment TVLs, not the legacy asset-position valuation. Unknown or disabled slugs return 404; incomplete deployment metadata returns 503.
curl --request GET \
--url https://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries', 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.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries",
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://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries"
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://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gauntlet.xyz/v1/vaults/slug/{slug}/timeseries")
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": [
{
"timestamp": "2023-11-07T05:31:56Z",
"tvl": {
"usd": "<string>"
},
"apy_30d": 123,
"apy_7d": 123,
"apy_90d": 123,
"unit_price": "<string>",
"total_supply": "<string>"
}
],
"meta": {
"count": 123,
"limit": 123,
"refreshed_at": "2023-11-07T05:31:56Z",
"request_id": "<string>",
"end": "2023-11-07T05:31:56Z",
"next_cursor": "<string>",
"partial_errors": [
{
"code": "<string>",
"message": "<string>",
"resource_id": "<string>"
}
],
"resolved_vault_id": "<string>",
"start": "2023-11-07T05:31:56Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}| Field | Scope |
|---|---|
tvl.usd | Sum across all currently linked deployments |
apy_7d, apy_30d, apy_90d | Admin-selected primary deployment; respects APY visibility |
unit_price | Primary deployment, in its numeraire-token units per share |
total_supply | Sum of outstanding shares across all currently linked deployments |
meta.resolved_vault_id identifies the primary supplying the deployment-local
metrics. Rates and share prices are not summed or averaged.
The /primary/timeseries endpoint still returns only primary-deployment data,
including tvl.native. The logical-vault endpoint exposes USD TVL only because
linked deployments can use different numeraires.
Snapshots are aligned by timestamp, with the same date range, granularity,
ordering, and cursor parameters as deployment history. A missing primary
snapshot makes its APY and price null at that timestamp; another
deployment’s metrics are never substituted. A missing USD price does not hide
otherwise available supply or primary metrics.
Before a deployment’s indexed creation time, it contributes zero to TVL. After
creation, a missing snapshot or USD price makes the aggregate tvl.usd null;
clients should render a gap rather than zero or a partial sum. Supply follows
the same inception and snapshot-gap rules, but does not depend on USD prices.
Missing supply makes total_supply null.
Linked share-issuing deployments must represent the same logical share asset.
The current cross-chain groups (gtusda, stgusda, and devusda2) use
Aspen multichain pricing with summed share supply. Values are
not carried forward. Missing deployment metadata fails the request.
Membership and primary selection follow the current Admin registry.
This sums deployment TVLs; it does not reproduce the old Aera API’s separate
asset-position valuation or include pending deposits held in provisioners.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Admin-curated public vault slug
Query Parameters
Window start: ISO 8601 date or RFC 3339 timestamp.
Window end: ISO 8601 date or RFC 3339 timestamp.
Opaque cursor from previous meta.next_cursor.
Page size (1–10000, default 1000).
Sort direction: asc (default) or desc.
Sampling granularity: day (default), hour, week, or month.