curl --request GET \
--url https://api.webacy.com/rwa \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/rwa"
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/rwa', 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/rwa",
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/rwa"
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/rwa")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/rwa")
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",
"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,
"price_source_deviation": 123,
"volume_z_5m": 123,
"volume_z_60m": 123,
"risk": {},
"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
}{
"message": "Unauthorized"
}{
"x402Version": 1,
"error": "payment required"
}{
"message": "Payment service temporarily unavailable"
}List pegged tokens — stablecoins & RWAs
Returns paginated rows of pegged tokens with score, tier, market data, optional cross-chain rollups, DEX market entries, migration lifecycle, audit provenance, and score deltas. The aggregates block (aggregates.tier_counts, total_mcap, total_volume_24h, leaderboards) is computed after segment but BEFORE every other filter, so dashboards show segment-wide context regardless of the active view filters. The TOP-LEVEL tier_counts is different: it is computed after all filters. segment is the one exception — it defines the caller’s universe and is applied before the aggregates, so segment=stablecoin returns stablecoin-only aggregates / tier_counts; pegType and every other filter remain post-aggregate view filters. stale: true indicates the response is served from the fallback cache during an upstream data outage.
curl --request GET \
--url https://api.webacy.com/rwa \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/rwa"
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/rwa', 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/rwa",
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/rwa"
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/rwa")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/rwa")
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",
"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,
"price_source_deviation": 123,
"volume_z_5m": 123,
"volume_z_60m": 123,
"risk": {},
"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
}{
"message": "Unauthorized"
}{
"x402Version": 1,
"error": "payment required"
}{
"message": "Payment service temporarily unavailable"
}Splitting stablecoins from RWAs
segment scopes the list to one category and is applied before aggregates, so the aggregates describe the selected segment rather than the whole pegged universe.
aggregates — including aggregates.tier_counts — is computed on the segment alone, with every other filter applied after it. The top-level tier_counts is computed after all of them. A KPI strip built on the assumption that both track the same filter set will drift as soon as a second filter is applied.| Segment | Rule |
|---|---|
rwa | is_rwa is true and asset_class is not fiat |
stablecoin | everything else |
segment alongside the asset_class / is_rwa / subclass it was derived from.
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.segment takes stablecoin or rwa. It is not the asset_class dimension, which reads fiat, fixed-income, commodity and so on. Passing a dimension value is ignored like any other unknown enum value, which returns the unfiltered list rather than an error.asset_class = fiat means the token is denominated in a government currency, not that it is backed by cash. USDC, DAI and USDe are all fiat-denominated.
pegType is a separate axis — how the peg is held (direct, collateralized, algorithmic, derivative-hedged, yield-bearing) — and stays a view filter applied after the aggregates. A token with no denomination record falls back to a currency lookup, where the listed fiat codes read direct, so treat direct as “cash-backed or not yet classified”.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. Unknown values are ignored (the filter is not applied).
critical, warning, watch, ok, premium Filter by segment. A segment is a derived category over the classification dimensions, not a dimension value — do NOT pass an asset_class such as fiat or fixed-income here; each item carries both its computed segment and the dimensions it was derived from. rwa = is_rwa true and asset_class not fiat (tokenized treasuries/funds, gold); stablecoin = everything else. The two are exclusive and partition the list. NOTE: stablecoin is NOT the same as asset_class fiat — membership also admits tokens for their stable peg behaviour, and those rows deliberately carry no asset_class yet resolve to stablecoin. Read each row's asset_class to separate confirmed fiat from null. Applied BEFORE aggregates/tier_counts (they describe the selected segment). Unknown values are ignored.
stablecoin, rwa Filter by peg mechanism (denomination.pegType). Combine with segment=stablecoin: direct = fiat-backed, collateralized = crypto-backed. 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). Non-numeric values are ignored.
0 <= x <= 100Maximum risk score (0-100). Non-numeric values are ignored.
0 <= x <= 100Minimum market cap in USD. Non-numeric values are ignored.
x >= 0Filter by liquidity tier. Unknown values are ignored (the filter is not applied).
high, medium, low, very_low Substring match on symbol, name, or address.
100Unknown values fall back to the default sort.
score, symbol, chain, tier, abs_dev_clean, market_cap_usd, ts Anything other than asc/desc falls back to desc.
asc, desc When true, include excluded/problematic tokens that are normally suppressed.
When true, return only collapsed/dead tokens (graveyard view).
Values below 1 are treated as 1.
x >= 1Clamped to 1–500.
1 <= x <= 500Response
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.
