Address risk scoring with entity attribution, source of funds and counterparties. No API key, no signup, no paid tier. One POST and you have a score.
This runs as-is. The address below is a sanctioned exchange, so you get a non-trivial response rather than an empty one.
curl -X POST https://intelapi.publicaml.org/v1/enrich \
-H 'Content-Type: application/json' \
-d '{
"addresses": [
{
"wallet_address": "0x08723392ed15743cc38513c4925f5e6be5c17243",
"chain": "ETH"
}
]
}'{
"entities": [
{
"aml_score": 100.0,
"label": "Chatex (OFAC Sanctioned)",
"category": "cex",
"sanctioned": true,
"aml_score_breakdown": {
"direct_exposure": 100.0,
"indirect_exposure": 25.0,
"sanction_direct": {
"label": "sanction",
"source": "chainabuse:opensanctions",
"score": 100.0
},
"propagated_sources": [
{ "category": "sanction", "hops": 0, "score": 100.0 },
{ "category": "mixer", "hops": 3, "score": 10.0 }
]
}
}
]
}const res = await fetch('https://intelapi.publicaml.org/v1/enrich', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
addresses: [{ wallet_address: address, chain: 'ETH' }],
}),
})
const { entities } = await res.json()
const [{ aml_score }] = entities
if (aml_score >= 70) {
// block the transfer, or warn before signing
}A number you cannot explain to a user — or a regulator — is not much use. The response shows what produced it.
Scored separately. An address on a sanctions list and an address that merely received funds from one are different situations, and the response keeps them apart.
Each contributing source is listed with its category, hop distance and score — so you can see that a score of 25 came from a mixer three hops away, not from the address itself.
How far taint travels is policy, per risk class: sanctions carry to distant hops at a score floor, informational categories stop early. Published, not hidden.
Reported apart from the address score, because clean behaviour funded by tainted money is a different problem from wrongdoing.
Base URL https://intelapi.publicaml.org. Every endpoint below is callable right now without credentials.
/v1/enrichRisk score with full breakdown, entity attribution, source of funds and counterparties. The main endpoint.
Reference for /v1/enrich →{
"addresses": [
{ "wallet_address": "0x…", "chain": "ETH" }
],
"include": ["aml_score", "category", "counterparties", "source_of_funds"],
"top_n": 5
}/v1/counterpartiesWho an address transacts with, with labels, token flows and transaction counts. Requires a category, filter or kinds selector.
Reference for /v1/counterparties →{
"wallet_address": "0x…",
"chain": "ETH",
"kinds": ["venue"],
"limit": 20
}/v1/transactionsTransactions between two addresses. Direct edges on EVM chains, shared-transaction traversal on BTC.
Reference for /v1/transactions →{
"from": "0x…",
"to": "0x…",
"chain": "BSC",
"limit": 50
}/v1/address-transactionsTransaction history for a single address.
Reference for /v1/address-transactions →{
"address": "0x…",
"chain": "ETH",
"limit": 50
}/v1/entitiesResolve cluster ids to labels, categories, size and sanction status.
Reference for /v1/entities →{
"entity_ids": ["unnamed:eth:0x…"]
}/v1/cluster-mappingsList the wallet addresses that belong to a cluster, paged by cursor.
Reference for /v1/cluster-mappings →{
"entity_ids": ["unnamed:eth:0x…"],
"limit": 100
}/statsDataset coverage: clusters, members, counterparty edges and sanction seeds per chain.
Reference for /stats →Our MCP server puts wallet screening, fund tracing and counterparty lookup directly into Claude, Cursor and any other MCP client. Ask about an address in plain language and the assistant checks it against PublicAML.
npx -y @publicaml/mcp-server{
"mcpServers": {
"publicaml": {
"command": "npx",
"args": ["-y", "@publicaml/mcp-server"]
}
}
}Bitcoin, Ethereum, BNB Chain and TRON. Works with no account; an optional API key only raises the rate limit. View on npm
| Chain | Clusters | Addresses | Edges |
|---|---|---|---|
| BTC | 2,140,332 | 49.0M | 6.09B |
| ETH | 3,799,784 | 351.7M | 6.65B |
| BSC | 167,486 | 230.1M | 47.15B |
| TRON | 11,937 | 20.7M | 12.82B |
Live figures from GET /stats. Counts on the largest tables are planner estimates so the endpoint stays fast.
This is address KYT (Know Your Transaction) / AML screening - risk on a wallet address before you send or accept funds. It is not identity KYC. Pair it with your own policies for custody and fiat rails.
No. There is no key, no signup and no paid tier. Send a POST and you get a response. If that changes we will say so publicly rather than quietly gating existing integrations.
POST https://intelapi.publicaml.org/v1/enrich with JSON {"addresses":[{"wallet_address":"0x…","chain":"ETH"}]}. The response includes aml_score (0-100), sanctioned, label, category and optional counterparties / source_of_funds. Interactive sandbox: https://intelapi.publicaml.org/
A 0-100 score split into direct exposure (the address itself appearing on a list or matching a detector) and indirect exposure (funds received from such an address). The response includes propagated_sources, listing each contributing source with its category, hop distance and score, so you can see precisely what produced the number.
It depends on the risk class, and the policy is documented rather than hidden. Sanctions are carried to distant hops at a score floor; informational categories stop early. This is deliberate - a score you cannot explain to a user or a regulator is not much use.
Bitcoin, Ethereum, BNB Smart Chain and TRON, including token transfers such as USDT on Ethereum and TRON.
Yes, and it is free to do so. If you are integrating into a wallet, exchange, OTC desk or DeFi interface, get in touch and we will help with the integration and let you know about changes in advance.
There is no published hard limit for normal integration traffic. Heavy or batch workloads should contact us first so we can plan capacity rather than throttle you unexpectedly.
If you run a wallet, exchange, OTC desk or DeFi interface and want to warn users before funds leave, we will help you integrate and tell you about changes in advance. Operated by the PublicAML Foundation, a Delaware non-profit — free is the model, not a trial.