curl --request GET \
--url https://api.webacy.com/v3/stablecoins/{address} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/v3/stablecoins/{address}"
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/{address}', 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/{address}",
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/{address}"
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/{address}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/v3/stablecoins/{address}")
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.5",
"classification_available": true,
"metadata": {
"address": "0x100faa513ac917181eb29f73b64bf7a434a206fe",
"chain": "base",
"symbol": "usdb",
"name": "USDBridge",
"asset_type": "stablecoin",
"segment": "stablecoin",
"asset_class": "fiat",
"subclass": null,
"market_cap_usd": null
},
"composite": {
"grading_scheme": "v1",
"grade": "A-",
"stars": 5,
"score": 14.5,
"contributors": {
"smart_contract": {
"score": 41.5,
"weight": 0.2,
"weighted_contribution": 8.3
},
"operational_governance": {
"score": 41.5,
"weight": 0.15,
"weighted_contribution": 6.2
},
"asset_collateral": {
"score": 0,
"weight": 0.3,
"weighted_contribution": 0
},
"market_liquidity": {
"score": 0,
"weight": 0.2,
"weighted_contribution": 0
},
"counterparty": {
"score": 0,
"weight": 0,
"weighted_contribution": 0
},
"hack_exploit_history": {
"score": 0,
"weight": 0.15,
"weighted_contribution": 0
},
"chain_infrastructure": {
"score": 0,
"weight": 0,
"weighted_contribution": 0
}
},
"upstream_risk": 12,
"clamped_by_upstream": false,
"score_source": "framework",
"drivers_complete": true,
"drivers": [
{
"category": "smart_contract",
"category_name": "Smart contract",
"score": 41.5,
"weight": 0.2,
"weighted_contribution": 8.3,
"criteria": [
{
"key": "audited",
"name": "Has third-party audits",
"status": "warn",
"evidence": {
"audit_count": 1,
"auditor_tier": "mid"
}
},
{
"key": "mint_cap_present",
"name": "Minting is capped",
"status": "warn",
"evidence": {
"mint_cap_status": "uncapped"
}
}
]
}
]
},
"categories": {
"asset_collateral": {
"score": 0,
"criteria": {
"share_price_stable": {
"name": "Not depegged",
"status": "pass",
"data_quality": {
"confidence": 0.95,
"last_observed_at": "2026-06-02T09:49:36Z",
"source": "rwa-grade-pipeline"
}
},
"mint_burn_anomaly": {
"name": "No mint/burn anomalies",
"status": "pass",
"data_quality": {
"confidence": 0.95,
"last_observed_at": "2026-06-02T09:49:36Z",
"source": "rwa-grade-pipeline"
}
}
}
},
"smart_contract": {
"score": 41.5,
"criteria": {
"audited": {
"name": "Has third-party audits",
"status": "warn",
"data_quality": {
"confidence": 0.95,
"last_observed_at": "2026-06-02T09:49:36Z",
"source": "rwa-grade-pipeline"
}
},
"mint_cap_present": {
"name": "Minting is capped",
"status": "warn",
"data_quality": {
"confidence": 0.95,
"last_observed_at": "2026-06-02T09:49:36Z",
"source": "rwa-grade-pipeline"
}
}
}
}
},
"coverage": {
"framework_version": "v1",
"total_criteria": 12,
"live_criteria": 8,
"per_category": {
"smart_contract": {
"live": 2,
"total": 2
},
"operational_governance": {
"live": 2,
"total": 4
},
"asset_collateral": {
"live": 2,
"total": 3
},
"market_liquidity": {
"live": 1,
"total": 2
},
"counterparty": {
"live": 0,
"total": 0
},
"hack_exploit_history": {
"live": 1,
"total": 1
},
"chain_infrastructure": {
"live": 0,
"total": 0
}
}
},
"attributes": {
"market": {
"price_usd": 1,
"volume_24h_usd": 45000000
},
"liquidity": {
"total_dex_liquidity_usd": 50000000,
"liquidity_depth_tier": "deep"
},
"classification": {
"token_type": "standard"
},
"issuer": {
"issuer": "Example Labs",
"is_bridged": false,
"bridged_fraction": 0.04,
"reserve_attestation_provider": "Deloitte",
"reserve_attestation_type": "monthly_attestation",
"reserve_attestation_date": "2026-06-30",
"reserve_attestation_lag_days": 10
},
"audits": {
"audit_count": 5,
"auditor_tier": "top",
"last_audit_date": "2026-02-15",
"audit_firms": [
"OpenZeppelin",
"Trail of Bits"
]
},
"governance": {
"governance_tier": "strong",
"owner_is_multisig": true,
"multisig_threshold": 4,
"multisig_signer_count": 8,
"owner_timelock_seconds": 86400,
"upgrade_admin_address": "0xC0ffee0000000000000000000000000000000002",
"upgrade_admin_is_eoa": false,
"currently_paused": false,
"governance_alert": null,
"governance_alert_detail": null,
"mint_role_is_single_eoa": false,
"mint_role_alert": null,
"mint_authority": null,
"mint_activity_total_minted_30d": null,
"mint_activity_tx_count_30d": null,
"mint_activity_alert": null,
"upgrades_30d": 0,
"pause_events_90d": 0,
"ownership_changes_90d": 1,
"mint_role_grants_90d": 2,
"mint_role_revocations_90d": 0
},
"hacks": {
"has_exploit_history": false,
"exploit_total_usd": null,
"hack_classification": null,
"hack_technique": null
},
"sanctions": {
"sanctions_status": null,
"sanctions_designations": null
}
}
}Get Stablecoin Risk Detail
Stablecoin-only twin of GET /v3/rwa/{address}: identical response for a stablecoin; answers 404 when the token resolves to an RWA (metadata.asset_type = rwa) and names GET /v3/rwa/{address} as the route to use. The class is derived, not asserted: stablecoin means “pegged and not a classified RWA”, so a token that is graded but not yet classified takes the stablecoin arm and answers 200. Read metadata.asset_class to tell a confirmed fiat token (fiat) from a not-yet-classified one (null); classification coverage is still expanding, so that second set is shrinking over time.
curl --request GET \
--url https://api.webacy.com/v3/stablecoins/{address} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/v3/stablecoins/{address}"
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/{address}', 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/{address}",
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/{address}"
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/{address}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/v3/stablecoins/{address}")
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.5",
"classification_available": true,
"metadata": {
"address": "0x100faa513ac917181eb29f73b64bf7a434a206fe",
"chain": "base",
"symbol": "usdb",
"name": "USDBridge",
"asset_type": "stablecoin",
"segment": "stablecoin",
"asset_class": "fiat",
"subclass": null,
"market_cap_usd": null
},
"composite": {
"grading_scheme": "v1",
"grade": "A-",
"stars": 5,
"score": 14.5,
"contributors": {
"smart_contract": {
"score": 41.5,
"weight": 0.2,
"weighted_contribution": 8.3
},
"operational_governance": {
"score": 41.5,
"weight": 0.15,
"weighted_contribution": 6.2
},
"asset_collateral": {
"score": 0,
"weight": 0.3,
"weighted_contribution": 0
},
"market_liquidity": {
"score": 0,
"weight": 0.2,
"weighted_contribution": 0
},
"counterparty": {
"score": 0,
"weight": 0,
"weighted_contribution": 0
},
"hack_exploit_history": {
"score": 0,
"weight": 0.15,
"weighted_contribution": 0
},
"chain_infrastructure": {
"score": 0,
"weight": 0,
"weighted_contribution": 0
}
},
"upstream_risk": 12,
"clamped_by_upstream": false,
"score_source": "framework",
"drivers_complete": true,
"drivers": [
{
"category": "smart_contract",
"category_name": "Smart contract",
"score": 41.5,
"weight": 0.2,
"weighted_contribution": 8.3,
"criteria": [
{
"key": "audited",
"name": "Has third-party audits",
"status": "warn",
"evidence": {
"audit_count": 1,
"auditor_tier": "mid"
}
},
{
"key": "mint_cap_present",
"name": "Minting is capped",
"status": "warn",
"evidence": {
"mint_cap_status": "uncapped"
}
}
]
}
]
},
"categories": {
"asset_collateral": {
"score": 0,
"criteria": {
"share_price_stable": {
"name": "Not depegged",
"status": "pass",
"data_quality": {
"confidence": 0.95,
"last_observed_at": "2026-06-02T09:49:36Z",
"source": "rwa-grade-pipeline"
}
},
"mint_burn_anomaly": {
"name": "No mint/burn anomalies",
"status": "pass",
"data_quality": {
"confidence": 0.95,
"last_observed_at": "2026-06-02T09:49:36Z",
"source": "rwa-grade-pipeline"
}
}
}
},
"smart_contract": {
"score": 41.5,
"criteria": {
"audited": {
"name": "Has third-party audits",
"status": "warn",
"data_quality": {
"confidence": 0.95,
"last_observed_at": "2026-06-02T09:49:36Z",
"source": "rwa-grade-pipeline"
}
},
"mint_cap_present": {
"name": "Minting is capped",
"status": "warn",
"data_quality": {
"confidence": 0.95,
"last_observed_at": "2026-06-02T09:49:36Z",
"source": "rwa-grade-pipeline"
}
}
}
}
},
"coverage": {
"framework_version": "v1",
"total_criteria": 12,
"live_criteria": 8,
"per_category": {
"smart_contract": {
"live": 2,
"total": 2
},
"operational_governance": {
"live": 2,
"total": 4
},
"asset_collateral": {
"live": 2,
"total": 3
},
"market_liquidity": {
"live": 1,
"total": 2
},
"counterparty": {
"live": 0,
"total": 0
},
"hack_exploit_history": {
"live": 1,
"total": 1
},
"chain_infrastructure": {
"live": 0,
"total": 0
}
}
},
"attributes": {
"market": {
"price_usd": 1,
"volume_24h_usd": 45000000
},
"liquidity": {
"total_dex_liquidity_usd": 50000000,
"liquidity_depth_tier": "deep"
},
"classification": {
"token_type": "standard"
},
"issuer": {
"issuer": "Example Labs",
"is_bridged": false,
"bridged_fraction": 0.04,
"reserve_attestation_provider": "Deloitte",
"reserve_attestation_type": "monthly_attestation",
"reserve_attestation_date": "2026-06-30",
"reserve_attestation_lag_days": 10
},
"audits": {
"audit_count": 5,
"auditor_tier": "top",
"last_audit_date": "2026-02-15",
"audit_firms": [
"OpenZeppelin",
"Trail of Bits"
]
},
"governance": {
"governance_tier": "strong",
"owner_is_multisig": true,
"multisig_threshold": 4,
"multisig_signer_count": 8,
"owner_timelock_seconds": 86400,
"upgrade_admin_address": "0xC0ffee0000000000000000000000000000000002",
"upgrade_admin_is_eoa": false,
"currently_paused": false,
"governance_alert": null,
"governance_alert_detail": null,
"mint_role_is_single_eoa": false,
"mint_role_alert": null,
"mint_authority": null,
"mint_activity_total_minted_30d": null,
"mint_activity_tx_count_30d": null,
"mint_activity_alert": null,
"upgrades_30d": 0,
"pause_events_90d": 0,
"ownership_changes_90d": 1,
"mint_role_grants_90d": 2,
"mint_role_revocations_90d": 0
},
"hacks": {
"has_exploit_history": false,
"exploit_total_usd": null,
"hack_classification": null,
"hack_technique": null
},
"sanctions": {
"sanctions_status": null,
"sanctions_designations": null
}
}
}GET /v3/rwa/{address}. Identical response for a stablecoin.
composite.score and every categories.*.score run 0–100 (A+ ≈ 0, F ≈ 100). See Score Polarity.Responses specific to this route
| Status | When |
|---|---|
404 | The token is not in the graded universe at all. |
404 | The token is graded but resolves to an RWA. The message names GET /api/v3/rwa/{address}?chain=<chain> as the route to use. |
503 | The classification could not be loaded, so membership cannot be proven. Retry, or use GET /v3/rwa/{address}, which serves both segments. |
404 here does not imply the token is an RWA, and retrying an ungraded token against /v3/rwa/{address} will 404 as well.
The segment gate reads the same derived value the list and grades routes filter on, exposed as metadata.segment and mirrored on the legacy metadata.asset_type, so the three surfaces cannot disagree.
stablecoin arm and answers 200. Read metadata.asset_class to separate a confirmed fiat token ("fiat") from one carrying none (null) — either not classified yet, or classified as stable without a confirmed backing.metadata.asset_type carries the same value as metadata.segment and predates the split; prefer segment in new integrations.
Authorizations
Path Parameters
Token contract address.
Query Parameters
Chain identifier (e.g. eth, base, pol). Required.
eth, base, bsc, pol, opt, arb, avax, sol, stellar, hedera, tron, sui, ton, sei, btc, gnosis 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
Webacy-native v3 RWA / stablecoin detail.
Webacy-native v3 RWA / stablecoin detail. Same shape family as VaultV3Response, minus the risk pass-through (the v2 RWA grade has no risk envelope; the headline signal is composite, floored by upstream_risk).
"3.5"
Structural fact sheet for an RWA / stablecoin — identities only.
Show child attributes
Show child attributes
Headline grade block. POLARITY (load-bearing): score is 0–100, HIGHER = WORSE (A+ = 0, F = 100) — same direction as the v2 risk.score on the same response. score = max(Σ contributors·weight, upstream_risk): floored from below by the upstream pipeline risk.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
How many criteria are live today vs defined by the framework — so what the grade reflects is on the wire, not just in docs.
Show child attributes
Show child attributes
Curated, grouped passthrough of the RWA grade record's detail-only facts. Always present as a block; individual leaves are null when the underlying value is not available. The safety score/grade are intentionally excluded — composite remains the only grade.
Show child attributes
Show child attributes
false when the asset classification could not be loaded — metadata.asset_type falls back to stablecoin and asset_class / subclass are null. GET /v3/stablecoins/{address} fails closed (503) in that state.
