Free AML screening API

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.

Counterparty edges
72.7B
Clustered addresses
625.2M
Clusters
6.1M
Labeled entities
242.6M

Quickstart

This runs as-is. The address below is a sanctioned exchange, so you get a non-trivial response rather than an empty one.

Request
curl -X POST https://intelapi.publicaml.org/v1/enrich \
  -H 'Content-Type: application/json' \
  -d '{
    "addresses": [
      {
        "wallet_address": "0x08723392ed15743cc38513c4925f5e6be5c17243",
        "chain": "ETH"
      }
    ]
  }'
Response (abridged)
{
  "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  }
        ]
      }
    }
  ]
}
Pre-transaction check in JavaScript
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
}

See the same AML check in Python, JavaScript, Go and cURL →

Every score comes with its reasoning

A number you cannot explain to a user — or a regulator — is not much use. The response shows what produced it.

Direct vs indirect exposure

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.

Propagated sources

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.

Documented propagation depth

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.

Source of funds, separately

Reported apart from the address score, because clean behaviour funded by tainted money is a different problem from wrongdoing.

Endpoints

Base URL https://intelapi.publicaml.org. Every endpoint below is callable right now without credentials.

POST/v1/enrich

Risk 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
}
POST/v1/counterparties

Who 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
}
POST/v1/transactions

Transactions 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
}
POST/v1/address-transactions

Transaction history for a single address.

Reference for /v1/address-transactions
{
  "address": "0x…",
  "chain": "ETH",
  "limit": 50
}
POST/v1/entities

Resolve cluster ids to labels, categories, size and sanction status.

Reference for /v1/entities
{
  "entity_ids": ["unnamed:eth:0x…"]
}
POST/v1/cluster-mappings

List the wallet addresses that belong to a cluster, paged by cursor.

Reference for /v1/cluster-mappings
{
  "entity_ids": ["unnamed:eth:0x…"],
  "limit": 100
}
GET/health

Service status, including label-cache age and backing stores.

Reference for /health
GET/stats

Dataset coverage: clusters, members, counterparty edges and sanction seeds per chain.

Reference for /stats

AML screening inside your AI assistant

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.

v0.1.149 downloads / weekMITupdated 2026-08-28
Run it
npx -y @publicaml/mcp-server
screen_address
Risk level, sanctions, issuer freezes, what the address is.
trace_funds
Who funded a wallet, or where its money went.
list_counterparties
Who it dealt with, and what each counterparty is.
Claude Desktop config
{
  "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

Coverage

ChainClustersAddressesEdges
BTC2,140,33249.0M6.09B
ETH3,799,784351.7M6.65B
BSC167,486230.1M47.15B
TRON11,93720.7M12.82B

Live figures from GET /stats. Counts on the largest tables are planner estimates so the endpoint stays fast.

API questions

Is this KYT or KYC?

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.

Do I need an API key?

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.

How do I check a crypto wallet address free via API?

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/

What does the risk score actually mean?

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.

How far does risk propagate?

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.

Which chains are covered?

Bitcoin, Ethereum, BNB Smart Chain and TRON, including token transfers such as USDT on Ethereum and TRON.

Can I use this in production?

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.

What are the rate limits?

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.

Integrating?

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.