Lookalike check before sending USDC.
POST /address/check
Paid · $0.001 USDC per call · x402 · eip155:8453
Address-poisoning check before sending USDC on Base (paid, $0.001; recent-window / RPC coverage)
GET, same price
GET /address/check?from=&to=&contacts=a,b (or contacts-only ?recipient=&known=a,b, or recipient-only ?address=) with the x402 payment header: same price, same result as POST. Unpaid GET returns the same 402.
Request
Two shapes: {from, to, contacts?} scans the sender's history; contacts-only {to, contacts} without from (aliases recipient/address + known_addresses/known) runs an offline lookalike check against contacts only (no RPC; from null, coverage.source contacts_only). Recipient-only {to} alone (alias address, e.g. Verdix {address, chain}) scans that address's OWN recent Base USDC history for poisoning fingerprints (from null, coverage.mode recipient_only, recipient{fingerprint: paid_after_zero_value|zero_value_only|zero_value_plus_activity|sub_cent_only|no_activity|none, counts}).
{
"to": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"from": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"contacts": [
"string"
]
}
Responses
| Status | What comes back |
200 | {from, to, risk: low|medium|high, seenBefore, lookalikes[{address, inbound, outbound, dustTransfers, realOut, lastBlock, sampleTx, pattern}], reasons[], ignoredFields?/ignoredNote? (request fields Shield did not use, e.g. lookback_blocks/dust_threshold/tier), contacts?{checked, inContacts, lookalikes[{contact, prefixMatch, suffixMatch}]} (only when contacts sent), coverage{windowBlocks, scannedFrom, scannedTo, coveragePct, lowCoverage, complete, transfersSeen, counterparties, rpcCalls}}. coverage.lowCoverage=true when coveragePct < 10 (free RPCs scanned almost nothing): the first reason then says risk low is NOT a safety signal; retry, pass contacts, or use /address/check/full. Risk enum stays low|medium|high. |
400 | Bad input |
402 | Payment required |
502 | Upstream RPC failure |
POST /address/check/full
Paid · $0.005 USDC per call · x402 · eip155:8453
Full-history address-poisoning check (paid, $0.005; one Blockscout index call, up to 500 transfers; not charged if index down)
GET, same price
GET /address/check/full?from=&to= with the x402 payment header: same price, same result as POST. Unpaid GET returns the same 402.
Request
{
"from": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"to": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"contacts": [
"string"
]
}
Responses
| Status | What comes back |
200 | Same shape as /address/check with coverage.source=blockscout, coverage.indexerMode (tokentx|v2), and historyComplete when the call reaches history start |
400 | Bad input |
402 | Payment required |
502 | Upstream RPC failure |
503 | Indexer unavailable: not charged, retry later or use /address/check |
POST /demo/address
Free
Free Shield demo: fixed contacts-only lookalike fixture (body ignored; same shape as paid POST /address/check contacts-only + mode:demo, demo:true, priceCharged:0)
Responses
| Status | What comes back |
200 | {mode:demo, demo:true, priceCharged:0, from:null, to, risk:high, contacts, coverage.source:contacts_only, ...} same fields as contacts-only /address/check |