curl --request GET \
--url https://api.atlasyield.club/v1/scores \
--header 'x-api-key: <api-key>'import requests
url = "https://api.atlasyield.club/v1/scores"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.atlasyield.club/v1/scores', 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.atlasyield.club/v1/scores",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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.atlasyield.club/v1/scores"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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.atlasyield.club/v1/scores")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atlasyield.club/v1/scores")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"scorerVersion": "2.2.0",
"count": 570,
"total": 570,
"applied": {},
"ignoredParams": [
"<string>"
],
"explain": {
"universe": 123,
"candidates": 123,
"matched": 123,
"returned": 123,
"truncated": true,
"failed": {
"belowMinScore": 123,
"belowMinTvl": 123,
"belowMinApy": 123,
"noDepositRoute": 123,
"noLiveEntry": 123,
"fallbackData": 123
},
"liveCatalogEntries": 123,
"notable": [
{
"vaultId": "<string>",
"name": "<string>",
"composite": 123,
"apy": 123,
"tvl": 123,
"reasons": [
"<string>"
]
}
],
"similarAssets": [
{
"asset": "<string>",
"count": 123
}
]
},
"disclaimer": "Research and information, not investment advice.",
"data": [
{
"vaultId": "aave-v3:8453:0x4e65fe4dba92790696d040ac24aa414708f5c0ab",
"chainId": 8453,
"protocolId": "aave-v3",
"name": "Aave V3 USDC",
"onchainId": "0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB",
"adminTopology": {
"class": "immutable",
"curatorId": "<string>",
"curatorRating": "established",
"timelockSeconds": 123,
"roles": [
{
"role": "<string>",
"kind": "none",
"threshold": 123,
"owners": 123,
"delaySeconds": 123,
"unverifiedGovernance": true
}
],
"checkedAt": "2023-11-07T05:31:56Z"
},
"asset": "USDC",
"assetClass": "stablecoin",
"composite": 87.5,
"label": "Conservative",
"pillarScores": {
"yield": 82,
"safety": 90,
"liquidity": 88,
"sustainability": 85
},
"apy": 5.21,
"tvl": 1250400,
"dataQuality": "sufficient",
"scoredAt": "2023-11-07T05:31:56Z",
"scorerVersion": "2.2.0"
}
]
}Latest scores
The most recent composite + pillar scores for every tracked vault — one row per vault, newest first.
curl --request GET \
--url https://api.atlasyield.club/v1/scores \
--header 'x-api-key: <api-key>'import requests
url = "https://api.atlasyield.club/v1/scores"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.atlasyield.club/v1/scores', 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.atlasyield.club/v1/scores",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$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.atlasyield.club/v1/scores"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
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.atlasyield.club/v1/scores")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atlasyield.club/v1/scores")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"scorerVersion": "2.2.0",
"count": 570,
"total": 570,
"applied": {},
"ignoredParams": [
"<string>"
],
"explain": {
"universe": 123,
"candidates": 123,
"matched": 123,
"returned": 123,
"truncated": true,
"failed": {
"belowMinScore": 123,
"belowMinTvl": 123,
"belowMinApy": 123,
"noDepositRoute": 123,
"noLiveEntry": 123,
"fallbackData": 123
},
"liveCatalogEntries": 123,
"notable": [
{
"vaultId": "<string>",
"name": "<string>",
"composite": 123,
"apy": 123,
"tvl": 123,
"reasons": [
"<string>"
]
}
],
"similarAssets": [
{
"asset": "<string>",
"count": 123
}
]
},
"disclaimer": "Research and information, not investment advice.",
"data": [
{
"vaultId": "aave-v3:8453:0x4e65fe4dba92790696d040ac24aa414708f5c0ab",
"chainId": 8453,
"protocolId": "aave-v3",
"name": "Aave V3 USDC",
"onchainId": "0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB",
"adminTopology": {
"class": "immutable",
"curatorId": "<string>",
"curatorRating": "established",
"timelockSeconds": 123,
"roles": [
{
"role": "<string>",
"kind": "none",
"threshold": 123,
"owners": 123,
"delaySeconds": 123,
"unverifiedGovernance": true
}
],
"checkedAt": "2023-11-07T05:31:56Z"
},
"asset": "USDC",
"assetClass": "stablecoin",
"composite": 87.5,
"label": "Conservative",
"pillarScores": {
"yield": 82,
"safety": 90,
"liquidity": 88,
"sustainability": 85
},
"apy": 5.21,
"tvl": 1250400,
"dataQuality": "sufficient",
"scoredAt": "2023-11-07T05:31:56Z",
"scorerVersion": "2.2.0"
}
]
}Authorizations
Optional. Not needed for any endpoint in this spec. Unlocks the partner-only endpoints and a 100 requests per minute bucket (public limit is 60 per IP).
Query Parameters
Filter to one EVM chain id.
Filter to one protocol slug.
One vault by on-chain address (last segment of vaultId, case-insensitive). Returns at most one row per chain.
Underlying asset symbol, case-insensitive exact match. Accepts a comma list of up to 10 (USDC,USDT0). Exact means exact: USDC does not match syrupUSDC. Use explain=true to see near-miss symbols.
Keep vaults with composite >= this value.
0 <= x <= 100Keep vaults whose LIVE TVL (USD) is >= this value.
x >= 0Keep vaults whose LIVE APY (percentage points) is >= this value. A vault with no APY never clears it.
x >= 0Only vaults a deposit can reach. Excludes vaults flagged unroutable and, failing closed, vaults missing from the live catalog. Only the value true is accepted.
true Exclude rows scored on fallback data (dataQuality = fallback).
true Adds an explain block saying what the filters removed: counts per filter, the dropped vaults and why (best-ranked first, with up to 2 slots held for vaults dropped as unreachable or low-confidence), and near-miss asset symbols. Counts are per filter, so a vault failing two filters is counted under both.
true Sort descending by this field (apy and tvl are the live values). Omit to keep the default order.
composite, apy, tvl Return at most this many rows, applied after filtering and sorting.
1 <= x <= 200compact returns the small CompactScore row instead of the full Score.
compact Response
Latest scores for the tracked vaults that match.
true
"2.2.0"
Rows returned.
570
Rows matching the filters before limit is applied.
570
Every filter this server honoured, echoed back. If you sent a parameter and it is missing here, the API predates it and the rows are not filtered by it.
Query keys this endpoint does not recognise, sorted, at most 20 of at most 64 characters. Present only when there is at least one. An unknown key is not an error: it is ignored, so a typo such as minAPY returns 200 with the rows NOT filtered by it. If you expected a filter to apply, check that its name is not listed here.
Only with explain=true.
Show child attributes
Show child attributes
"Research and information, not investment advice."
- Option 1
- Option 2
Show child attributes
Show child attributes