curl --request GET \
--url https://api.webacy.com/rwa/supply \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/rwa/supply"
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/supply', 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/supply",
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/supply"
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/supply")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/rwa/supply")
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": [
{
"symbol": "<string>",
"name": "<string>",
"canonical_id": "<string>",
"token_type": "fiat",
"peg_type": "<string>",
"supply": 123,
"net_24h": 123,
"net_7d": 123,
"net_30d": 123,
"net_90d": 123,
"minted_24h": 123,
"burned_24h": 123,
"minted_7d": 123,
"burned_7d": 123,
"net_24h_pct": 123,
"net_7d_pct": 123,
"net_30d_pct": 123,
"pressure_vs_30d": 123,
"risk_score_as_of_generated_at": 123,
"risk_tier_as_of_generated_at": "critical",
"has_bridged_data": true,
"total_native_supply": 123,
"total_bridged_supply": 123,
"bridged_fraction": 123,
"organic_net_24h": 123,
"bridge_flow_pct": 123,
"chains": {},
"llama_id": "<string>"
}
],
"pagination": {
"total": 1,
"page": 2,
"pageSize": 250,
"totalPages": 2
},
"aggregates": {
"totals": {
"total_supply": 123,
"net_minted_24h": 123,
"net_burned_24h": 123,
"net_24h": 123,
"net_7d": 123,
"net_30d": 123,
"mcap_7d_pct": 123,
"token_count": 1,
"network_count": 1,
"stress_tokens": [
"<string>"
],
"bank_run_gauge": 0,
"minting_pressure": 0,
"supply_by_category": {
"fiat": {
"supply": 123,
"pct": 0.5
},
"crypto": {
"supply": 123,
"pct": 0.5
},
"synthetic": {
"supply": 123,
"pct": 0.5
}
}
}
},
"generated_at": "2023-11-07T05:31:56Z",
"stale": true,
"degraded": true
}{
"message": "Unauthorized"
}{
"x402Version": 1,
"error": "payment required"
}{
"message": "Payment service temporarily unavailable"
}List stablecoin supply flows
Returns paginated per-token supply-flow rows plus an aggregates envelope carrying the hero metrics (bank_run_gauge, minting_pressure, supply_by_category, network_count, stress_tokens, mcap_7d_pct). Aggregates are computed over the filtered set before pagination; mcap_7d_pct and stress_tokens pass through from the pipeline’s universe-level totals. Data is refreshed daily — responses carry stale: true when the snapshot is older than 25h or served from the fallback cache during an upstream data outage, and degraded: true only during a total outage (stale snapshot AND zero tokens) — an empty items with degraded: false is genuinely empty.
curl --request GET \
--url https://api.webacy.com/rwa/supply \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/rwa/supply"
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/supply', 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/supply",
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/supply"
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/supply")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/rwa/supply")
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": [
{
"symbol": "<string>",
"name": "<string>",
"canonical_id": "<string>",
"token_type": "fiat",
"peg_type": "<string>",
"supply": 123,
"net_24h": 123,
"net_7d": 123,
"net_30d": 123,
"net_90d": 123,
"minted_24h": 123,
"burned_24h": 123,
"minted_7d": 123,
"burned_7d": 123,
"net_24h_pct": 123,
"net_7d_pct": 123,
"net_30d_pct": 123,
"pressure_vs_30d": 123,
"risk_score_as_of_generated_at": 123,
"risk_tier_as_of_generated_at": "critical",
"has_bridged_data": true,
"total_native_supply": 123,
"total_bridged_supply": 123,
"bridged_fraction": 123,
"organic_net_24h": 123,
"bridge_flow_pct": 123,
"chains": {},
"llama_id": "<string>"
}
],
"pagination": {
"total": 1,
"page": 2,
"pageSize": 250,
"totalPages": 2
},
"aggregates": {
"totals": {
"total_supply": 123,
"net_minted_24h": 123,
"net_burned_24h": 123,
"net_24h": 123,
"net_7d": 123,
"net_30d": 123,
"mcap_7d_pct": 123,
"token_count": 1,
"network_count": 1,
"stress_tokens": [
"<string>"
],
"bank_run_gauge": 0,
"minting_pressure": 0,
"supply_by_category": {
"fiat": {
"supply": 123,
"pct": 0.5
},
"crypto": {
"supply": 123,
"pct": 0.5
},
"synthetic": {
"supply": 123,
"pct": 0.5
}
}
}
},
"generated_at": "2023-11-07T05:31:56Z",
"stale": true,
"degraded": true
}{
"message": "Unauthorized"
}{
"x402Version": 1,
"error": "payment required"
}{
"message": "Payment service temporarily unavailable"
}Authorizations
Query Parameters
Filter to tokens with any supply on this chain. Whole-row counts — a multi-chain token contributes its full supply to the returned totals under every chain it appears on.
eth, arb, opt, pol, base, bsc, sol, tron Filter by backing mechanism Backing mechanism derived by the pipeline from the upstream peg mechanism.
fiat, crypto, synthetic, other Filter by risk tier denormalized at the supply pipeline's generated_at (not live). Rows with a null tier are excluded. Risk tier denormalized from the risk-monitor pipeline at the supply snapshot's generated_at (not live).
critical, warning, watch, ok Case-insensitive substring match on symbol or name
100Exact contract address (requires chain). Filters to the row whose per-chain address map carries this (chain, address), so a same-ticker token can never be returned. EVM addresses match case-insensitively.
Default abs_net_24h surfaces the largest mint-or-burn moves first
abs_net_24h, pressure_vs_30d, net_24h, net_30d, supply asc, desc x >= 11 <= x <= 500Response
Paginated supply-flow rows with aggregates over the filtered set
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
true when the snapshot is older than 25h or served from the fallback cache during an upstream data outage.
true only during a total supply-pipeline outage (stale snapshot AND zero tokens — the upstream data store is unavailable and the fallback cache is empty). Distinguishes "empty because the dataset is unavailable" from "genuinely empty": a fresh empty snapshot is stale: false, degraded: false. Same field on SupplyTokenResponse.
