curl --request POST \
--url https://api.atlasyield.club/v1/basket \
--header 'Content-Type: application/json' \
--data '
{
"positions": [
{
"chainId": 1,
"address": "0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a",
"weight": 60
}
]
}
'import requests
url = "https://api.atlasyield.club/v1/basket"
payload = { "positions": [
{
"chainId": 1,
"address": "0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a",
"weight": 60
}
] }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
positions: [
{chainId: 1, address: '0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a', weight: 60}
]
})
};
fetch('https://api.atlasyield.club/v1/basket', 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/basket",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'positions' => [
[
'chainId' => 1,
'address' => '0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a',
'weight' => 60
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.atlasyield.club/v1/basket"
payload := strings.NewReader("{\n \"positions\": [\n {\n \"chainId\": 1,\n \"address\": \"0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a\",\n \"weight\": 60\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.atlasyield.club/v1/basket")
.header("Content-Type", "application/json")
.body("{\n \"positions\": [\n {\n \"chainId\": 1,\n \"address\": \"0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a\",\n \"weight\": 60\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atlasyield.club/v1/basket")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"positions\": [\n {\n \"chainId\": 1,\n \"address\": \"0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a\",\n \"weight\": 60\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"disclaimer": "Research and information, not investment advice.",
"scorerVersion": "2.1.0",
"generatedAt": "2023-11-07T05:31:56Z",
"basket": {
"composite": 74.2,
"label": "Good",
"pillarScores": {
"yield": 123,
"safety": 123,
"liquidity": 123,
"sustainability": 123
},
"apy": 123,
"positions": 123,
"scoredPositions": 123,
"scoredWeight": 1,
"maxWeight": 123,
"chainShare": {},
"protocolShare": {}
},
"positions": [
{
"chainId": 123,
"address": "<string>",
"weight": 123,
"scored": true,
"vaultId": "<string>",
"name": "<string>",
"protocolId": "<string>",
"composite": 123,
"label": "<string>",
"apy": 123,
"tvl": 123,
"dataQuality": "sufficient",
"scoredAt": "2023-11-07T05:31:56Z"
}
]
}{
"success": false,
"error": "Validation error",
"details": {}
}Score a basket
Score a basket you define. Send up to 50 positions (chainId + vault address, optional weight) and get back each position’s current Atlas Score plus a weighted basket score: composite, pillars, and APY, weighted by position size. Weights are normalised, so percentages, USD amounts, and fractions all work; omit them for equal weight.
Coverage is disclosed, never assumed. A position Atlas does not score is returned with scored: false and excluded from the aggregate, and basket.scoredWeight reports the share of the basket the score actually covers. It is never averaged in as zero.
A pure computation over the request body: nothing is stored.
curl --request POST \
--url https://api.atlasyield.club/v1/basket \
--header 'Content-Type: application/json' \
--data '
{
"positions": [
{
"chainId": 1,
"address": "0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a",
"weight": 60
}
]
}
'import requests
url = "https://api.atlasyield.club/v1/basket"
payload = { "positions": [
{
"chainId": 1,
"address": "0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a",
"weight": 60
}
] }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
positions: [
{chainId: 1, address: '0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a', weight: 60}
]
})
};
fetch('https://api.atlasyield.club/v1/basket', 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/basket",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'positions' => [
[
'chainId' => 1,
'address' => '0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a',
'weight' => 60
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.atlasyield.club/v1/basket"
payload := strings.NewReader("{\n \"positions\": [\n {\n \"chainId\": 1,\n \"address\": \"0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a\",\n \"weight\": 60\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.atlasyield.club/v1/basket")
.header("Content-Type", "application/json")
.body("{\n \"positions\": [\n {\n \"chainId\": 1,\n \"address\": \"0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a\",\n \"weight\": 60\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.atlasyield.club/v1/basket")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"positions\": [\n {\n \"chainId\": 1,\n \"address\": \"0xd8a9f8b3c1b52e8a4f1e2f6c4e0b1a9c8d7e6f5a\",\n \"weight\": 60\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"disclaimer": "Research and information, not investment advice.",
"scorerVersion": "2.1.0",
"generatedAt": "2023-11-07T05:31:56Z",
"basket": {
"composite": 74.2,
"label": "Good",
"pillarScores": {
"yield": 123,
"safety": 123,
"liquidity": 123,
"sustainability": 123
},
"apy": 123,
"positions": 123,
"scoredPositions": 123,
"scoredWeight": 1,
"maxWeight": 123,
"chainShare": {},
"protocolShare": {}
},
"positions": [
{
"chainId": 123,
"address": "<string>",
"weight": 123,
"scored": true,
"vaultId": "<string>",
"name": "<string>",
"protocolId": "<string>",
"composite": 123,
"label": "<string>",
"apy": 123,
"tvl": 123,
"dataQuality": "sufficient",
"scoredAt": "2023-11-07T05:31:56Z"
}
]
}{
"success": false,
"error": "Validation error",
"details": {}
}Body
1 - 50 elementsShow child attributes
Show child attributes
Response
The basket score and each position.
true
"Research and information, not investment advice."
"2.1.0"
Show child attributes
Show child attributes
One entry per position sent, in order. Scored entries carry the same fields as a /scores row plus weight.
Show child attributes
Show child attributes