curl --request GET \
--url https://api.webacy.com/rwa/supply/{symbol} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/rwa/supply/{symbol}"
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/{symbol}', 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/{symbol}",
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/{symbol}"
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/{symbol}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/rwa/supply/{symbol}")
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{
"token": {
"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>"
},
"generated_at": "2023-11-07T05:31:56Z",
"stale": true,
"degraded": true,
"address_unmatched": true,
"collision": true,
"candidates": [
{
"canonical_id": "<string>",
"symbol": "<string>",
"name": "<string>",
"token_type": "<string>",
"supply": 123,
"addresses": {}
}
]
}{
"message": "Unauthorized"
}{
"x402Version": 1,
"error": "payment required"
}{
"message": "Payment service temporarily unavailable"
}Get supply-flow detail for one token
Case-insensitive symbol lookup. For symbols that collide across tokens, send chain + address (strongest) or canonicalId to pin a deterministic row, or tokenType as a soft disambiguator. Without a pin, the largest-supply token wins and, when the symbol matches more than one distinct token, the response carries collision: true plus a candidates list so callers can re-query pinned. Returns 404 when the symbol is absent from a resolved snapshot, or when canonicalId is supplied but no row matches that {symbol, canonicalId} pair. During partial outage (stale cache, known symbol) the response carries stale: true; during total outage (fallback cache also empty) returns 200 with token: null, stale: true, degraded: true, the same outage envelope as the list endpoint, so clients can distinguish a retryable outage from a permanent 404.
curl --request GET \
--url https://api.webacy.com/rwa/supply/{symbol} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/rwa/supply/{symbol}"
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/{symbol}', 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/{symbol}",
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/{symbol}"
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/{symbol}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/rwa/supply/{symbol}")
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{
"token": {
"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>"
},
"generated_at": "2023-11-07T05:31:56Z",
"stale": true,
"degraded": true,
"address_unmatched": true,
"collision": true,
"candidates": [
{
"canonical_id": "<string>",
"symbol": "<string>",
"name": "<string>",
"token_type": "<string>",
"supply": 123,
"addresses": {}
}
]
}{
"message": "Unauthorized"
}{
"x402Version": 1,
"error": "payment required"
}{
"message": "Payment service temporarily unavailable"
}Authorizations
Path Parameters
Token symbol (case-insensitive, e.g. USDT)
Query Parameters
Canonical override — pins the response to the row with this canonical id. Use for stable URLs on long-tail symbols that may collide later.
Soft disambiguator when canonicalId is not supplied
Backing mechanism derived by the pipeline from the upstream peg mechanism.
fiat, crypto, synthetic, other Chain of the exact contract to resolve (pair with address). Strongest disambiguator: send chain + address so a same-symbol, different-contract row is never returned.
Contract address of the exact deployment (pair with chain). When the feed does not track this contract separately, the response is { token: null, address_unmatched: true } (no flows) rather than another same-symbol contract's flows.
Response
Supply-flow row for the resolved token plus envelope. During total outage token is null and degraded is true.
null when degraded is true (total outage, no snapshot to resolve the symbol against) or when address_unmatched is true.
- Option 1
- Option 2
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). When true, token is null — retry later rather than treating the response as a permanent miss. Same field on SupplyListResponse.
Present and true when chain + address was supplied but the feed does not track that exact contract. token is null and no flows are attributed, instead of returning another same-symbol contract's flows. Distinct from an outage (degraded).
Present and true when the symbol matches more than one distinct token and no pin (canonicalId or chain + address) was supplied. token still resolves to the largest-supply row, but callers should disambiguate via candidates.
All same-symbol candidate rows when collision is true.
Show child attributes
Show child attributes
