Token Risk Audit
ERC-20 token risk audit for AI agents, bots and DeFi workflows on Base. One call answers 'how risky does this token look?' from public data: the token's on-chain interface (name, symbol, decimals, total supply read directly via RPC), contract verification status and proxy/upgradeability from Blockscout, whether ownership has been renounced (owner() live-read — an owner-controlled token can often mint, pause or change rules), holder count and top-holder concentration (excluding burn addresses; a token where one wallet holds most of the supply can be dumped at will), malicious public tags (phishing/scam/exploit), current USD price where known, and an exact-match sanctions screen of the contract address against the OFAC SDN digital-currency address list and UN consolidated list held locally and refreshed daily. Output is a 0-100 risk score, a clear/review/high verdict and named flags explaining every point. Honest scope: this is a static and market-structure analysis, not a honeypot/trade simulation — a clear result is not proof of legitimacy and a flag is not proof of wrongdoing. Not financial, legal or compliance advice.
Call with x402
1. Send the request. 2. Receive 402 with accepts[]. 3. Sign the payment and retry with the X-PAYMENT header.
curl -X POST https://agentbit.app/v1/risk/token \
-H 'Content-Type: application/json' \
-d '{"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}'
Input schema
{
"type": "object",
"properties": {
"address": {
"type": "string",
"description": "ERC-20 token CONTRACT address on Base (0x + 40 hex)"
}
},
"required": [
"address"
]
}Output schema
{
"type": "object",
"properties": {
"address": {
"type": "string"
},
"network": {
"type": "string"
},
"sanctioned": {
"type": "boolean"
},
"token": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
]
},
"symbol": {
"type": [
"string",
"null"
]
},
"decimals": {
"type": [
"integer",
"null"
]
},
"total_supply": {
"type": [
"string",
"null"
]
},
"holders_count": {
"type": [
"integer",
"null"
]
},
"price_usd": {
"type": [
"number",
"null"
]
}
}
},
"contract": {
"type": "object",
"properties": {
"verified": {
"type": [
"boolean",
"null"
]
},
"owner_status": {
"type": "string",
"enum": [
"renounced",
"owned",
"unknown"
]
},
"owner": {
"type": [
"string",
"null"
]
},
"proxy_type": {
"type": [
"string",
"null"
]
},
"public_tags": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"holders": {
"type": "object",
"properties": {
"top_holder_percent": {
"type": [
"number",
"null"
]
},
"top10_percent": {
"type": [
"number",
"null"
]
},
"note": {
"type": [
"string",
"null"
]
}
}
},
"risk_score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"risk": {
"type": "string",
"enum": [
"clear",
"review",
"high"
]
},
"flags": {
"type": "array",
"items": {
"type": "string"
}
},
"disclaimer": {
"type": "string"
}
}
}Code examples
// JavaScript (x402-fetch)
import { wrapFetchWithPayment } from "x402-fetch";
const fetchWithPay = wrapFetchWithPayment(fetch, wallet);
const r = await fetchWithPay("https://agentbit.app/v1/risk/token", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"})
});
console.log(await r.json());
# Python (x402 client)
from x402.clients.requests import x402_requests
s = x402_requests(account)
r = s.post("https://agentbit.app/v1/risk/token",
json={"address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"})
print(r.json())
// PHP
$r = Http::withHeaders(['X-PAYMENT' => $signedPayment])
->post('https://agentbit.app/v1/risk/token',
array (
'address' => '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
));
$data = $r->json();