curl --request GET \
--url https://api.webacy.com/v3/rwa/{address} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/v3/rwa/{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/rwa/{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/rwa/{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/rwa/{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/rwa/{address}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/v3/rwa/{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",
"metadata": {
"address": "0x100faa513ac917181eb29f73b64bf7a434a206fe",
"chain": "base",
"symbol": "usdb",
"name": "USDBridge",
"asset_type": "stablecoin",
"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 risk detail for a single RWA
Returns the v3 Webacy-native RWA / stablecoin decomposition: composite grade + per-category contributors, the dense categories criteria map, and coverage disclosure. No risk pass-through (the v2 RWA grade has none; composite carries the headline, floored by upstream_risk). POLARITY: scores 0–100, higher = worse.
CU cost: 1 CU per request (v3-rwa-detail).
curl --request GET \
--url https://api.webacy.com/v3/rwa/{address} \
--header 'x-api-key: <api-key>'import requests
url = "https://api.webacy.com/v3/rwa/{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/rwa/{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/rwa/{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/rwa/{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/rwa/{address}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.webacy.com/v3/rwa/{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",
"metadata": {
"address": "0x100faa513ac917181eb29f73b64bf7a434a206fe",
"chain": "base",
"symbol": "usdb",
"name": "USDBridge",
"asset_type": "stablecoin",
"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
}
}
}composite.score and every categories.*.score run 0–100, where 0 = no structural risk and 100 = maximum risk (grade A+ ≈ 0, F ≈ 100) — the opposite of yield or performance scores. See Score Polarity for the full grade bands.Assessing freshness
stale flag or generated_at. For a freshness signal, read the RWA grades list (GET /v3/rwa/grades), which carries generated_at and stale.Treat missing, stale, or errored data as unknown — never as safe. See Hard-gating and fail behavior.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 (default v1). Unknown values return 400 with the supported list.
v1 Response
Webacy-native v3 RWA / stablecoin detail.
Webacy-native v3 RWA / stablecoin detail (RFC-019 Phase 2A). 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 (RFC-030 Phase 0-1). Always present as a block; individual leaves are null when the producer has not populated them. The safety score/grade are intentionally excluded — composite remains the only grade.
Show child attributes
Show child attributes
