curl --request GET \
--url https://api.webacy.com/v3/stablecoins \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/v3/stablecoins"
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', 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",
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"
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")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/v3/stablecoins")
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{
"items": [
{
"address": "<string>",
"chain": "<string>",
"symbol": "<string>",
"name": "<string>",
"assetType": "<string>",
"asset_class": "fiat",
"is_rwa": true,
"subclass": "tbill",
"denomination": {
"code": "<string>",
"name": "<string>",
"category": "<string>",
"pegRatio": "<string>",
"pegType": "<string>"
},
"has_monitor_data": true,
"ts": "2023-11-07T05:31:56Z",
"score": 123,
"tier": "critical",
"drivers": [
{
"name": "<string>",
"raw": 123,
"normalized": 123,
"weight": 123,
"contribution": 123
}
],
"price": 123,
"peg_value": 123,
"abs_dev_clean": 123,
"reference_price": 123,
"within_expected_range": true,
"token_type": "standard",
"token_labels": [
"<string>"
],
"peg_range": [
123
],
"is_collapsed": true,
"rwa_nav_usd": 123,
"rwa_classification": "tbill",
"rwa_nav_as_of": "<string>",
"market_cap_usd": 123,
"total_market_cap_usd": 123,
"market_cap_by_chain": {},
"circulating_supply": 123,
"total_supply_on_chain": 123,
"total_supply_cross_chain": 123,
"fdv_usd": 123,
"volume_24h": 123,
"volume_24h_usd": 123,
"dex_volume_24h_usd": 123,
"volume_mcap_ratio": 123,
"markets": [
{
"dex": "<string>",
"pair": "<string>",
"pool_address": "<string>",
"chain": "<string>",
"liquidity_usd": 123,
"volume_24h_usd": 123
}
],
"markets_all_chains": [
{
"dex": "<string>",
"pair": "<string>",
"pool_address": "<string>",
"chain": "<string>",
"liquidity_usd": 123,
"volume_24h_usd": 123
}
],
"total_dex_liquidity_all_chains_usd": 123,
"migration": {
"status": "active",
"target_symbol": "<string>",
"target_address": "<string>",
"ratio": 123,
"notes": "<string>"
},
"project_info": {
"issuer": "<string>",
"audit_count": 123,
"audit_firms": [
"<string>"
],
"auditor_tier": "top",
"last_audit_date": "<string>",
"audit_report_urls": [
"<string>"
],
"notes": "<string>"
},
"score_delta_24h": 123,
"score_delta_7d": 123,
"liquidity_tier": "high",
"slippage_bps_100k": 123,
"liquidity_available_100k": true,
"liquidity_decay_pct": 123,
"liquidity_decay_flag": true,
"volume_60m": 123,
"volatility_burst": true,
"volatility_ratio": 123,
"max_drawdown_5m": 123,
"mins_over_50bp_60m": 123,
"mins_over_100bp_60m": 123,
"streak_over_50bp_min": 123,
"streak_over_100bp_min": 123,
"chain_spread_5m": 123,
"chain_spread_60m": 123,
"price_source_deviation": 123,
"volume_z_5m": 123,
"volume_z_60m": 123,
"oracle_price": 123,
"oracle_deviation_bps": 123,
"oracle_deviation_flag": true,
"risk": {},
"grade": "A-",
"segment": "stablecoin"
}
],
"pagination": {
"total": 1,
"page": 2,
"pageSize": 250,
"totalPages": 1
},
"aggregates": {
"generated_at": "<string>",
"tier_counts": {
"critical": 1,
"warning": 1,
"watch": 1,
"ok": 1
},
"total_mcap": 123,
"total_volume_24h": 123,
"at_peg_count": 123,
"at_peg_total": 123,
"monitored_count": 123,
"stability_index": 123,
"biggest_depegs": [
{
"symbol": "<string>",
"chain": "<string>",
"address": "<string>",
"price": 123,
"peg_value": 123,
"abs_dev_clean": 123,
"score": 123,
"tier": "critical"
}
],
"highest_risk": [
{
"symbol": "<string>",
"chain": "<string>",
"address": "<string>",
"score": 123,
"tier": "critical",
"market_cap_usd": 123
}
],
"most_stable": [
{
"symbol": "<string>",
"chain": "<string>",
"address": "<string>",
"score": 123,
"tier": "critical",
"market_cap_usd": 123
}
]
},
"tier_counts": {
"critical": 1,
"warning": 1,
"watch": 1,
"ok": 1
},
"stale": true,
"schema_version": "3.3",
"grades_available": true
}{
"x402Version": 1,
"error": "payment required"
}{
"message": "Unauthorized"
}{
"message": "Payment service temporarily unavailable"
}List Stablecoins
Stablecoin-only twin of GET /v3/rwa: the depeg list with segment fixed to stablecoin. stablecoin here is the derived segment, not asset_class fiat: membership also admits tokens for their stable peg behaviour, and those rows carry no asset_class. Read each row’s asset_class to separate confirmed fiat from null. Each row is enriched with the v3 composite letter grade (grade, null when ungraded) plus top-level schema_version and grades_available. Accepts every GET /rwa filter except segment; pegType narrows by peg mechanism; note direct is also the fallback for a token with no recorded denomination, so it means “cash-backed OR not yet classified”, and yield-bearing cuts across the other four rather than being a fifth peer. Requires the v3 API usage plan. aggregates (including aggregates.tier_counts) covers the segment-selected universe: the segment is applied before aggregation, every other filter after it. The TOP-LEVEL tier_counts is different — it counts the filtered result set, before pagination. pegType and the other filters are post-aggregate view filters.
curl --request GET \
--url https://api.webacy.com/v3/stablecoins \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/v3/stablecoins"
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', 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",
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"
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")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/v3/stablecoins")
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{
"items": [
{
"address": "<string>",
"chain": "<string>",
"symbol": "<string>",
"name": "<string>",
"assetType": "<string>",
"asset_class": "fiat",
"is_rwa": true,
"subclass": "tbill",
"denomination": {
"code": "<string>",
"name": "<string>",
"category": "<string>",
"pegRatio": "<string>",
"pegType": "<string>"
},
"has_monitor_data": true,
"ts": "2023-11-07T05:31:56Z",
"score": 123,
"tier": "critical",
"drivers": [
{
"name": "<string>",
"raw": 123,
"normalized": 123,
"weight": 123,
"contribution": 123
}
],
"price": 123,
"peg_value": 123,
"abs_dev_clean": 123,
"reference_price": 123,
"within_expected_range": true,
"token_type": "standard",
"token_labels": [
"<string>"
],
"peg_range": [
123
],
"is_collapsed": true,
"rwa_nav_usd": 123,
"rwa_classification": "tbill",
"rwa_nav_as_of": "<string>",
"market_cap_usd": 123,
"total_market_cap_usd": 123,
"market_cap_by_chain": {},
"circulating_supply": 123,
"total_supply_on_chain": 123,
"total_supply_cross_chain": 123,
"fdv_usd": 123,
"volume_24h": 123,
"volume_24h_usd": 123,
"dex_volume_24h_usd": 123,
"volume_mcap_ratio": 123,
"markets": [
{
"dex": "<string>",
"pair": "<string>",
"pool_address": "<string>",
"chain": "<string>",
"liquidity_usd": 123,
"volume_24h_usd": 123
}
],
"markets_all_chains": [
{
"dex": "<string>",
"pair": "<string>",
"pool_address": "<string>",
"chain": "<string>",
"liquidity_usd": 123,
"volume_24h_usd": 123
}
],
"total_dex_liquidity_all_chains_usd": 123,
"migration": {
"status": "active",
"target_symbol": "<string>",
"target_address": "<string>",
"ratio": 123,
"notes": "<string>"
},
"project_info": {
"issuer": "<string>",
"audit_count": 123,
"audit_firms": [
"<string>"
],
"auditor_tier": "top",
"last_audit_date": "<string>",
"audit_report_urls": [
"<string>"
],
"notes": "<string>"
},
"score_delta_24h": 123,
"score_delta_7d": 123,
"liquidity_tier": "high",
"slippage_bps_100k": 123,
"liquidity_available_100k": true,
"liquidity_decay_pct": 123,
"liquidity_decay_flag": true,
"volume_60m": 123,
"volatility_burst": true,
"volatility_ratio": 123,
"max_drawdown_5m": 123,
"mins_over_50bp_60m": 123,
"mins_over_100bp_60m": 123,
"streak_over_50bp_min": 123,
"streak_over_100bp_min": 123,
"chain_spread_5m": 123,
"chain_spread_60m": 123,
"price_source_deviation": 123,
"volume_z_5m": 123,
"volume_z_60m": 123,
"oracle_price": 123,
"oracle_deviation_bps": 123,
"oracle_deviation_flag": true,
"risk": {},
"grade": "A-",
"segment": "stablecoin"
}
],
"pagination": {
"total": 1,
"page": 2,
"pageSize": 250,
"totalPages": 1
},
"aggregates": {
"generated_at": "<string>",
"tier_counts": {
"critical": 1,
"warning": 1,
"watch": 1,
"ok": 1
},
"total_mcap": 123,
"total_volume_24h": 123,
"at_peg_count": 123,
"at_peg_total": 123,
"monitored_count": 123,
"stability_index": 123,
"biggest_depegs": [
{
"symbol": "<string>",
"chain": "<string>",
"address": "<string>",
"price": 123,
"peg_value": 123,
"abs_dev_clean": 123,
"score": 123,
"tier": "critical"
}
],
"highest_risk": [
{
"symbol": "<string>",
"chain": "<string>",
"address": "<string>",
"score": 123,
"tier": "critical",
"market_cap_usd": 123
}
],
"most_stable": [
{
"symbol": "<string>",
"chain": "<string>",
"address": "<string>",
"score": 123,
"tier": "critical",
"market_cap_usd": 123
}
]
},
"tier_counts": {
"critical": 1,
"warning": 1,
"watch": 1,
"ok": 1
},
"stale": true,
"schema_version": "3.3",
"grades_available": true
}{
"x402Version": 1,
"error": "payment required"
}{
"message": "Unauthorized"
}{
"message": "Payment service temporarily unavailable"
}segment pinned to stablecoin server-side — this route cannot return an RWA, and a caller-supplied segment is ignored.
Use it when your integration only ever wants stablecoins. If you need both segments from one call, use GET /rwa and pass segment yourself — note those rows do not carry the v3 composite grade this route adds.
grade (risk polarity: A+ ≈ 0 risk, F ≈ 100) and the v2 depeg score. Do not compare them directly. See Score Polarity.What counts as a stablecoin
A segment is a category derived from the asset classification fields (asset_class, is_rwa, subclass); it is not one of their values:
| Segment | Rule |
|---|---|
rwa | is_rwa is true and asset_class is not fiat |
stablecoin | everything else |
asset_class = fiat means the token is denominated in a government currency — it is not a statement about what backs the peg. USDC, DAI and USDe are all fiat-denominated and all stablecoins, whether the reserves are cash, over-collateralised crypto or a hedged derivative book.
asset_class value such as fiat or fixed-income to segment. They are different vocabularies: segment is stablecoin or rwa, while each returned row’s asset_class reads fiat, fixed-income, commodity and so on. Every row carries both, so you can see why it matched.segment = stablecoin is not the same as asset_class = "fiat".A token joins the pegged universe through any one of three signals: asset_class = "fiat", is_rwa = true, or a stable peg behaviour. The third admits tokens that assert a stable peg whose backing is not confirmed, and those deliberately carry no asset_class. They resolve to the stablecoin segment.Read each row’s asset_class to tell a confirmed fiat token ("fiat") from one carrying none (null). A non-trivial minority of stablecoin rows are null, so do not filter client-side on asset_class === "fiat" expecting the full set.Narrowing by peg mechanism
pegType filters by how the peg is held, which is a separate axis from the segment:
| Value | Meaning |
|---|---|
direct | held in cash and equivalents |
collateralized | crypto-backed, typically over-collateralised |
algorithmic | algorithmic supply control |
derivative-hedged | hedged derivative book |
yield-bearing | yield-bearing wrapper |
yield-bearing is not a fifth peer of the other four. The first four partition how the peg is defended; yield-bearing answers whether the holder receives yield, so it cuts across them. Treat the five as one selector rather than a clean taxonomy, and do not assume pegType=direct returns every cash-backed token.503 when the classification cannot be loaded; this list is served from a cached set of tracked tokens instead, so the same outage yields the last-known list, or an empty one, with 200. The stale flag reflects the pricing snapshot, not the token set, so it will not signal it either. Treat an unexpectedly empty result as unknown rather than as “no stablecoins match”.The 503 in the response list below is the payment path (x402), not a classification failure.direct. Treat direct as “cash-backed or not yet classified” rather than a confirmed reserve model.Authorizations
Query Parameters
Filter by short chain code (e.g. eth, arb, pol, opt, base, bsc, sol).
Filter by denomination code (e.g. USD, EUR, XAU).
Filter by display tier.
critical, warning, watch, ok, premium Filter by peg mechanism (denomination.pegType): direct = fiat-backed, collateralized = crypto-backed. A token with no recorded denomination falls back to Webacy's currency mapping, where the listed fiat codes read as direct; one with no denomination at all (a token pending classification, or a currency outside that mapping) is excluded by this filter. Unknown values are ignored.
direct, collateralized, algorithmic, derivative-hedged, yield-bearing Comma-separated token labels: standard, yield, rwa, gold, bridged, vault.
Minimum risk score (0-100).
0 <= x <= 100Maximum risk score (0-100).
0 <= x <= 100Minimum market cap in USD.
x >= 0Filter by liquidity tier.
high, medium, low, very_low Substring match on symbol, name, or address.
100score, symbol, chain, tier, abs_dev_clean, market_cap_usd, ts asc, desc When true, include excluded/problematic tokens that are normally suppressed.
When true, return only collapsed/dead tokens (graveyard view).
x >= 11 <= x <= 500Grading 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 pegged tokens with depeg risk data and ecosystem aggregates
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Ecosystem-wide aggregates computed before the view filters. When segment is supplied they describe that segment only (stablecoins or RWAs), since the segment filter is applied before aggregation.
Show child attributes
Show child attributes
Post-filter tier counts (after query filters, before pagination).
Show child attributes
Show child attributes
true when the snapshot is served from the fallback cache during an upstream data outage.
"3.3"
false when the grading pipeline was unavailable for this request (grades are null for that reason).
