Crypto wallet scam check API
Bewary's wallet API tells you whether a crypto address is on our scam list, built from reported scams, or on a US sanctions list, before anyone sends money to it. It reads Bitcoin, Ethereum and any EVM address, Tron, Litecoin, Solana, Monero and Dash addresses. It is a list check, not blockchain analytics: it does not follow funds on chain. A call costs 1 credit, a free key gets 1,000 credits a month, no card, and it answers in median 127 ms.
- Endpoint
- GET
https://api.bewary.app/v1/wallet/{chain}/{address} - Price
- 1 credit
- Free key
- 1,000 credits a month, no card
- Speed
- Median 127 ms, measured
- Returns
- verdict, p_scam, entities with typed facts, reason codes
- MCP tool
lookup_wallet
Try it
Free from this page: 10 lookups a dayCall it
curl "https://api.bewary.app/v1/wallet/eth/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe" import requests
r = requests.get("https://api.bewary.app/v1/wallet/eth/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe", timeout=10)
result = r.json()
print(result["verdict"], result["p_scam"], result["reason_codes"]) const res = await fetch("https://api.bewary.app/v1/wallet/eth/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe")
const result = await res.json()
console.log(result.verdict, result.p_scam, result.reason_codes) Act on the result
Copy-paste code that turns the answer into a decision. It runs with or without BEWARY_API_KEY. TypeScript uses bewary.d.ts.
import os, requests
def wallet_listed(chain, address):
key = os.environ["BEWARY_API_KEY"] # a free key: bewary.app/account
headers = {"Authorization": f"Bearer {key}"}
r = requests.get(f"https://api.bewary.app/v1/wallet/{chain}/{address}", headers=headers, timeout=10)
r.raise_for_status()
return r.json()["entities"][0]["facts"]["listed"]
if wallet_listed("eth", "0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe"):
print("Do not send: this wallet is reported in scams") import type { Envelope } from "./bewary"
export async function walletListed(chain: "btc" | "eth" | "trx" | "ltc" | "sol" | "xmr" | "dash", address: string): Promise<boolean> {
const key = process.env.BEWARY_API_KEY! // a free key: bewary.app/account
const headers: Record<string, string> = { Authorization: `Bearer ${key}` }
const res = await fetch(`https://api.bewary.app/v1/wallet/${chain}/${address}`,
{ headers, signal: AbortSignal.timeout(10_000) })
if (!res.ok) throw new Error(`Bewary ${res.status}`)
const e = (await res.json() as Envelope).entities[0]
return e.type === "wallet" && Boolean(e.facts.listed)
} Response
The fields you will use
entities[0].facts.listed- On Bewary's scam list.
entities[0].facts.sanctioned- On a US sanctions list (WALLET_SANCTIONED).
entities[0].facts.chain- btc, eth (any EVM address), trx, ltc, sol, xmr or dash, read from the address.
verdict- scam when listed, suspicious when only sanctioned, otherwise unknown.
{ "schema_version": "1.7.0", "request_id": "req_01M69WJ0M1XHQ3CJBJ1QQ1WC78", "checked_at": "2026-10-31T21:06:26Z", "engine": "bewary-engine/3.0.0", "models": { "calibration": "interim-band-v0" }, "input": { "kind": "lookup", "channel": "unknown", "language": null, "region": null }, "verdict": "unknown", "p_scam": 0.2, "risk_score": 20, "confidence": 0, "classification": null, "reason_codes": [], "entities": [ { "id": "e1", "type": "wallet", "value": "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae", "normalized": "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae", "role": "payee", "verdict": "unknown", "p_scam": 0.2, "risk_score": 20, "reason_codes": [], "facts": { "chain": "eth", "caip2": null, "listed": false, "sanctioned": false, "reports": null, "list_count": null }, "related": [], "datasets": [ { "dataset": "wallet_reports", "coverage": "WW", "in_coverage": true }, { "dataset": "sanctions", "coverage": "WW", "in_coverage": true }, { "dataset": "community_reports", "coverage": "WW", "in_coverage": true } ] } ], "signals": [], "degraded": false, "degraded_reasons": [], "cached": false, "explanation": null} { "schema_version": "1.7.0", "request_id": "req_01M69WJKJC0C57D2VXBXZHVQCS", "checked_at": "2026-10-31T21:06:45Z", "engine": "bewary-engine/3.0.0", "models": { "calibration": "interim-band-v0" }, "input": { "kind": "lookup", "channel": "unknown", "language": null, "region": null }, "verdict": "suspicious", "p_scam": 0.7914, "risk_score": 79, "confidence": 1, "classification": null, "reason_codes": [ "WALLET_SANCTIONED" ], "entities": [ { "id": "e1", "type": "wallet", "value": "0x098b716b8aaf21512996dc57eb0615e2383e2f96", "normalized": "0x098b716b8aaf21512996dc57eb0615e2383e2f96", "role": "payee", "verdict": "suspicious", "p_scam": 0.7914, "risk_score": 79, "reason_codes": [ "WALLET_SANCTIONED" ], "facts": { "chain": "eth", "caip2": null, "listed": false, "sanctioned": true, "reports": null, "list_count": 1 }, "related": [], "datasets": [ { "dataset": "wallet_reports", "coverage": "WW", "in_coverage": true }, { "dataset": "sanctions", "coverage": "WW", "in_coverage": true }, { "dataset": "community_reports", "coverage": "WW", "in_coverage": true } ] } ], "signals": [ { "code": "WALLET_SANCTIONED", "entity": "e1", "severity": "high", "weight": 75, "source_class": "confirmed", "p": null, "dataset": "sanctions", "coverage": "WW", "evidence": {} } ], "degraded": false, "degraded_reasons": [], "cached": false, "explanation": null} Real responses, captured from the live API on 2026-10-31. Every response has this shape: see Response format.
Crypto wallet facts
Every key is in every response, null when unknown. A key marked Coming stays null until its source ships, so you can code against it now.
| Key | Type | Meaning |
|---|---|---|
chain | btc | eth | trx | ltc | sol | xmr | dash or null | The chain, read from the address format. eth is any EVM address. |
listed | boolean or null | On Bewary's scam list. |
sanctioned | boolean or null | On a US sanctions list. |
caip2 | string or null | The CAIP-2 chain id where the chain is fixed. |
list_count | integer or null | How many lists name it, ours and others'. |
reportsComing | integer or null | How many reports name it. |
Parameters
| Name | Type | Description |
|---|---|---|
chainpath, required | string | btc, eth (any EVM address), trx, ltc, sol, xmr or dash. |
addresspath, required | string | The wallet address. |
Questions
How do I check if a crypto address is linked to a scam?
GET /v1/wallet/{chain}/{address} with btc, eth (any EVM address), trx, ltc, sol, xmr or dash. facts.listed is true when the address is on Bewary's scam list.
Does it trace transactions or screen sanctions?
It screens the US sanctions list: facts.sanctioned is true and the answer carries WALLET_SANCTIONED for an address on it. It does not follow funds on chain.
Is an unlisted wallet safe?
No. Not listed means nobody reported it to us yet, so the verdict is unknown.
Used for
- Warning before a user sends crypto to an address from a message.
- Screening payout addresses.
- Investigating a reported scam.
Reason codes it can return
| Code | Meaning | Severity |
|---|---|---|
LISTED_BLOCKLIST | On scam blocklist | Critical |
WALLET_LISTED | A wallet on a confirmed scam list | Critical |
WALLET_SANCTIONED | A wallet on a US sanctions list | High |
LISTED_CAUTION | On a broad threat list that also holds spam and malware hosts | Medium |
PLATFORM_TAKEDOWN | The hosting platform took it down | High |
PLATFORM_WARNING | The platform shows a phishing or malware warning in front of it | High |
Reserved codes are in the contract, not emitted yet. All reason codes
Updated · This page as Markdown · Changelog