curl --request GET \
--url https://api.webacy.com/v3/stablecoins/grades \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/v3/stablecoins/grades"
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.webacy.com/v3/stablecoins/grades', 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.webacy.com/v3/stablecoins/grades",
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.webacy.com/v3/stablecoins/grades"
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.webacy.com/v3/stablecoins/grades")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/v3/stablecoins/grades")
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{
"schema_version": "3.0",
"items": [
{
"symbol": "usdb",
"name": "USDBridge",
"chain": "base",
"address": "0x100faa513ac917181eb29f73b64bf7a434a206fe",
"market_cap_usd": null,
"tier": "ok",
"composite": {
"grading_scheme": "v2",
"grade": "A-",
"stars": 5,
"score": 14.5,
"contributors": {
"smart_contract": {
"score": 41.5,
"weight": 0.2
},
"operational_governance": {
"score": 41.5,
"weight": 0.15
},
"asset_collateral": {
"score": 0,
"weight": 0.3
},
"market_liquidity": {
"score": 0,
"weight": 0.2
},
"counterparty": {
"score": 0,
"weight": 0
},
"hack_exploit_history": {
"score": 0,
"weight": 0.15
},
"chain_infrastructure": {
"score": 0,
"weight": 0
}
},
"upstream_risk": 12,
"clamped_by_upstream": false
}
}
],
"pagination": {
"total": 1,
"page": 1,
"pageSize": 50,
"totalPages": 1
},
"grade_counts": {
"A-": 1
},
"generated_at": "2026-06-02T09:49:36Z",
"stale": false
}List Stablecoin Grades
Stablecoin-only twin of GET /v3/rwa/grades: identical response, with segment fixed to stablecoin — asset_class fiat plus graded tokens that have not been classified yet, i.e. everything the segment rule does not resolve to rwa. grade_counts still covers the full graded set. A caller-supplied segment is ignored.
curl --request GET \
--url https://api.webacy.com/v3/stablecoins/grades \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/v3/stablecoins/grades"
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.webacy.com/v3/stablecoins/grades', 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.webacy.com/v3/stablecoins/grades",
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.webacy.com/v3/stablecoins/grades"
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.webacy.com/v3/stablecoins/grades")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/v3/stablecoins/grades")
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{
"schema_version": "3.0",
"items": [
{
"symbol": "usdb",
"name": "USDBridge",
"chain": "base",
"address": "0x100faa513ac917181eb29f73b64bf7a434a206fe",
"market_cap_usd": null,
"tier": "ok",
"composite": {
"grading_scheme": "v2",
"grade": "A-",
"stars": 5,
"score": 14.5,
"contributors": {
"smart_contract": {
"score": 41.5,
"weight": 0.2
},
"operational_governance": {
"score": 41.5,
"weight": 0.15
},
"asset_collateral": {
"score": 0,
"weight": 0.3
},
"market_liquidity": {
"score": 0,
"weight": 0.2
},
"counterparty": {
"score": 0,
"weight": 0
},
"hack_exploit_history": {
"score": 0,
"weight": 0.15
},
"chain_infrastructure": {
"score": 0,
"weight": 0
}
},
"upstream_risk": 12,
"clamped_by_upstream": false
}
}
],
"pagination": {
"total": 1,
"page": 1,
"pageSize": 50,
"totalPages": 1
},
"grade_counts": {
"A-": 1
},
"generated_at": "2026-06-02T09:49:36Z",
"stale": false
}GET /v3/rwa/grades. Identical response, with segment pinned to stablecoin; a caller-supplied segment is ignored.
composite.score runs 0–100, where 0 = no structural risk and 100 = maximum risk (A+ ≈ 0, F ≈ 100). See Score Polarity.The segment rule on this list
The grades universe is our grading snapshot rather than the set of classified tokens, and many tokens in it are not classified yet. Those fall to thestablecoin arm, so here stablecoin means “pegged and not a classified RWA, including not-yet-classified” — it is not the same as asset_class = fiat.
Read each row’s asset_class to tell a confirmed fiat token ("fiat") from one carrying none (null). A null has two causes: the token has not been classified yet, or it is confirmed stable without a confirmed backing type. The two segments are exclusive and total, so the stablecoin and rwa counts add up to the unfiltered total.
grade_counts describes the full graded universe — before every filter and before pagination, so pinning the segment does not narrow it. That is deliberate, for parity with GET /v3/rwa/grades.When the classification is unavailable
The classification is resolved on every request. If it cannot be resolved, this route fails closed with503 rather than returning every graded token as though it were a stablecoin.
pegType is not accepted on either grades route — grade rows carry no denomination. Use GET /rwa for that filter.
The unfiltered GET /v3/rwa/grades degrades differently: it still answers 200, omits the classification fields on each row, and sets classification_available: false. Treat that flag as “unknown”, never as “not a stablecoin”.Authorizations
Query Parameters
Filter by chain slug (e.g. eth, base, pol).
Filter to a single grade letter. Accepts any letter from either scheme (the enum is the union); a letter the resolved grading_scheme never emits — e.g. E under v2 or C+ under v1 — simply matches no tokens.
A+, A, A-, B+, B, B-, C+, C, C-, D, E, F Minimum composite (risk) score, 0–100.
0 <= x <= 100Sort field.
score, symbol, chain, grade, market_cap_usd Sort order. Default asc (best grade first).
asc, desc 1-based page number.
x >= 1Items per page (default 50).
Grading scheme to pin — selects the per-category weights and letter-grade band table. Default v2 (alias of v1's weights, standard 11-band grade scale). peg is the peg-loss-focused weighting. v3/v4/peg-liquidity are registered but withheld behind the v3-grading-scheme feature flag. Unknown values return 400 with the supported list.
v1, v2, peg Response
Paginated list of graded tokens. grade_counts covers the full graded universe (pre-filter), not the filtered result or the returned page.
"3.0"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Grade-letter histogram over the FULL graded universe, computed before every filter (segment, chain, grade, minScore) — not the filtered or paged subset. In the resolved scheme's letters.
Show child attributes
Show child attributes
false when the asset classification could not be loaded — rows are unstamped and any segment filter was not applied.
