Get project TVL
Fetch a source-free daily TVL series for one visible project over a fixed 30- or 90-day window. Results are strictly ascending, contain at most 31 or 91 observations respectively, and derive the current value from the newest returned point. An existing project without an eligible current series returns availability=unavailable, null current fields, and empty history with HTTP 200. No bulk export, pagination, arbitrary dates, source, or provider fields are available.
GET
/
v1
/
projects
/
{slug}
/
tvl
Get project TVL
curl --request GET \
--url https://api.qoory.ai/v1/projects/{slug}/tvl \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.qoory.ai/v1/projects/{slug}/tvl"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.qoory.ai/v1/projects/{slug}/tvl', 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.qoory.ai/v1/projects/{slug}/tvl",
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.qoory.ai/v1/projects/{slug}/tvl"
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.qoory.ai/v1/projects/{slug}/tvl")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qoory.ai/v1/projects/{slug}/tvl")
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": {
"kind": "project_tvl",
"id": "uniswap",
"project": {
"id": "uniswap",
"slug": "uniswap",
"name": "Uniswap"
},
"range": "30d",
"availability": "available",
"current_tvl_usd": 1000000000,
"latest_snapshot_date": "2026-07-16",
"history_count": 3,
"history": [
{
"date": "2026-07-14",
"tvl_usd": 980000000
},
{
"date": "2026-07-15",
"tvl_usd": 995000000
},
{
"date": "2026-07-16",
"tvl_usd": 1000000000
}
]
},
"meta": {
"request_id": "req_example",
"credits_used": 2,
"credits_remaining": 98,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "INVALID_API_KEY",
"message": "The API key is invalid."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "Not enough credits are available for this request."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 0,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "The API key does not have the required scope."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The requested record was not found."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "INVALID_REQUEST",
"message": "The request parameters are invalid.",
"details": [
{
"path": "limit",
"message": "Expected a value within the documented range.",
"code": "too_big"
}
]
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "The request could not be completed."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}Authorizations
Use the HTTP authentication scheme with a Qoory API key.
Path Parameters
Exact Qoory slug for the target project.
Required string length:
1 - 160Query Parameters
Fixed historical window. Arbitrary start and end dates are not supported.
Available options:
30d, 90d Previous
Get project fundingFetch up to 20 source-free verified funding-round facts for one project by slug. Provider metadata, source URLs, investor lists, and copied announcement text are not exposed.
Next
⌘I
Get project TVL
curl --request GET \
--url https://api.qoory.ai/v1/projects/{slug}/tvl \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.qoory.ai/v1/projects/{slug}/tvl"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.qoory.ai/v1/projects/{slug}/tvl', 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.qoory.ai/v1/projects/{slug}/tvl",
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.qoory.ai/v1/projects/{slug}/tvl"
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.qoory.ai/v1/projects/{slug}/tvl")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qoory.ai/v1/projects/{slug}/tvl")
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": {
"kind": "project_tvl",
"id": "uniswap",
"project": {
"id": "uniswap",
"slug": "uniswap",
"name": "Uniswap"
},
"range": "30d",
"availability": "available",
"current_tvl_usd": 1000000000,
"latest_snapshot_date": "2026-07-16",
"history_count": 3,
"history": [
{
"date": "2026-07-14",
"tvl_usd": 980000000
},
{
"date": "2026-07-15",
"tvl_usd": 995000000
},
{
"date": "2026-07-16",
"tvl_usd": 1000000000
}
]
},
"meta": {
"request_id": "req_example",
"credits_used": 2,
"credits_remaining": 98,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "INVALID_API_KEY",
"message": "The API key is invalid."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "Not enough credits are available for this request."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 0,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "FORBIDDEN",
"message": "The API key does not have the required scope."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "NOT_FOUND",
"message": "The requested record was not found."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "INVALID_REQUEST",
"message": "The request parameters are invalid.",
"details": [
{
"path": "limit",
"message": "Expected a value within the documented range.",
"code": "too_big"
}
]
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "The request could not be completed."
},
"meta": {
"request_id": "req_example",
"credits_used": 0,
"credits_remaining": 100,
"rate_limit": {
"limit": 30,
"remaining": 29,
"reset_at": "2026-06-26T00:00:00.000Z",
"tier": "free"
}
}
}