Base mainnet · pay per call
Your agent is about to send money to an address. One call tells you what that address is, whether it is on the OFAC list, whether its code can be read or replaced, which privileged roles a token has, and what a real transfer actually delivers.
Every signal carries the observation it came from. Everything we could not check is listed beside the things we could — because an absent field that reads as a clean one is the difference between a signal and a lie.
no subscription5 Ounie credits an address, 8 a token contract. A check the chain would not answer refunds in full.
One spoke stays dark on purpose. That is the honest part.
What resolves
No indexer, no scraped feed, no model deciding anything. Chain reads, one keyless verification index, one public sanctions list, and one transfer we actually simulate.
Membership of the OFAC SDN digital-currency address list, fetched fresh and validated for length and shape before it is allowed to answer.
OFAC publishes no BASE tag, so a Base address is screened against the ETH-tagged entries. Correct practice, and an inference.
eth_getCode, read three ways: empty is a plain wallet, an 0xef0100 prefix is an EIP-7702 wallet that delegates to another contract, anything else is contract code.
Sourcify v2 for chain 8453.
Verified means the published source compiles to the deployed bytecode. It is not an audit and says nothing about whether the code is safe.
eth_getStorageAt across 5 standard proxy slots (EIP-1967, EIP-1822, ZeppelinOS, beacon, Safe singleton) plus both admin slots.
Nothing found means nothing in the STANDARD places. A bespoke proxy keeping its pointer elsewhere would not appear.
name(), symbol(), decimals() and totalSupply() read directly with eth_call.
Role getters (owner, pauser, blacklister, master minter, minter, rescuer, governance, timelock) plus AccessControl member counts. A getter that answers with a live account is proof that role exists.
PRESENCE ONLY. This signal can never come back clean: an empty return means 'no such function' on one contract, 'a fallback swallowed it' on another, and 'no code here' on a third. We will tell you a token HAS a pauser. We will never tell you it has none.
A real transfer, simulated with an eth_call state override, measuring what the recipient actually receives. Verified against a synthetic 10% fee token as well as against a clean one.
Measures the plain wallet-to-wallet path at this moment. A token that taxes only sells, only pair routes, or only above a threshold would still come back clean.
What we cannot check
Every response carries a notChecked array, and it is rendered beside the band everywhere the band appears. An agent that does not know what was skipped will read an absent field as a clean one.
Address age and first activity
Needs an indexed transaction history. Etherscan/Basescan V2 refuses free access on Base and does it SILENTLY — HTTP 200 with a body reading {"status":"0","message":"NOTOK"}, so a client checking res.ok reads the refusal as data. We hold no paid explorer key. Rather than estimate it, we do not have it.
Transaction count and history
Same paywall, same silent failure. Absent rather than approximated.
Holder concentration
Needs the full holder set, which is an explorer or an indexer. There is no keyless route to it, so no top-holder percentage is reported.
Liquidity and market depth
Reading pool depth honestly means indexing every venue on the chain. No keyless source, so no number.
Scoring transparency
The band is a pure function of the signals. No model touches it, and every signal comes back with its weight, its value and the observation it was derived from.
The rule that matters most is the one about gaps: a signal we could not observe leaves the denominator entirely rather than scoring zero. Scoring an unobservable signal as a failure would punish an address for our blind spot, and would quietly change what the number means every time an upstream wobbled.
Every signal that resolved looked ordinary.
Signals were uneven. Read the evidence.
Something resolved badly, or an OFAC hit forced it.
Too little resolved to publish a band at all.
For developers & AI agents
Three rails, one meter. Every call refuses rather than overdraws: an agent that runs out of credits gets a 402 with the exact shortfall and a link to top up, never a silent debt.
Bearer key or the shared Ounie session cookie. Synchronous — every signal comes back on the same request, each with the evidence it was read from.
curl -X POST https://onchain.ounie.com/api/checks \
-H "Authorization: Bearer chn_live_…" \
-H "Content-Type: application/json" \
-d '{"address":"0x8335…2913","kind":"auto"}'check_address, get_address_check, list_address_checks, get_supported_signals, get_credit_balance, get_pricing, whoami. Works in Claude, Cursor, ChatGPT and the Ounie AI Team — that last one can't set headers, so the key rides the URL.
Endpoint https://onchain.ounie.com/api/mcp (legacy SSE: /api/sse)
Auth Authorization: Bearer chn_live_…
# Hosts that can't set headers (e.g. the Ounie AI Team):
https://onchain.ounie.com/api/mcp?api_key=chn_live_…The caller here is already a wallet holding USDC on Base, which is the whole point. A malformed address is refused before it is ever quoted, so you never sign a payment for work that cannot succeed. Verification happens before settlement, so a check the chain would not answer never takes your money.
curl -X POST https://onchain.ounie.com/api/x402/check \
-H "Content-Type: application/json" \
-d '{"address":"0x8335…2913","kind":"token"}'
# → 402 { accepts: [{ scheme:"exact", network:"base",
# maxAmountRequired:"96000", payTo:"0x…" }] }
curl -X POST https://onchain.ounie.com/api/x402/check \
-H "X-Payment: <base64 signed payload>" \
-d '{"address":"0x8335…2913","kind":"token"}'5 credits an address, 8 a token contract · $0.060 and $0.096 on x402 · the dashboard keeps every check you have run, free to re-read.
Credit math
Ask for auto and you do not have to know in advance whether the address holds a token. We reserve 8 credits, settle 5 if it turned out to be a wallet, and return the difference to the exact pool it was drawn from.
On the keyless rail there is no refund — an on-chain settlement is final — so that rail asks you to name the kind, and refuses a non-answer before the money moves rather than after.
Questions
No, and we will never claim to. We probed a nonsense function selector against three things on Base: USDC reverted, WETH returned empty, and a plain wallet also returned empty. So an empty answer means “no such function” on one contract, “a catch-all fallback swallowed the call” on another, and “you mistyped the address” on a third — and real functions revert on malformed calldata, so a revert proves nothing either. We can show you a token HAS a pauser, because a getter that answers with a live account is proof. Absence is not provable with the reads available, and “no dangerous privileges” is the most dangerous sentence this product could print.
Because the block-explorer API refuses free access on Base, and refuses it silently — it answers HTTP 200 with a body reading status 0, message NOTOK. A client that checks whether the response was OK reads that refusal as data. We hold no paid explorer key, so age, first and last activity, transaction count and holder concentration are absent. They are listed in every response under notChecked with that reason, rather than estimated, rather than left quietly empty.
That every signal which resolved looked ordinary — nothing more. It is a band computed over the signals we could observe, and the response tells you exactly how many that was and which ones it was not. Read notChecked before you treat clear as an all-clear. This is a diligence signal, never a verdict on a counterparty, and never financial advice.
By a fixed arithmetic rule, not a model. Score equals 100 times the sum of value times weight, divided by the sum of weights, over resolved signals only — and any hard failure, which today means an OFAC hit, forces the high band outright regardless of the arithmetic. A signal we could not observe leaves the denominator entirely; it is never scored as a zero, because that would punish an address for our blind spot. Every signal comes back with its weight and its evidence, so you can recompute the number yourself.
We can only tell you nothing turned up in the standard slots. We read the EIP-1967, EIP-1822, ZeppelinOS, beacon and Safe singleton pointers — a set, not one, because probing EIP-1967 alone reports USDC as non-upgradeable, and USDC is a proxy: its implementation lives in the older ZeppelinOS slot. A bespoke proxy that keeps its pointer somewhere else would not show up in any sweep we can do, so the evidence line says nothing was found in the standard places rather than claiming the code is immutable.
By actually doing the transfer, in a simulation. An eth_call state override lets us replace an address's code and storage for the duration of one call, so we fund a probe contract with the token, have it transfer to a second address, and measure what arrives. It was verified in both directions before shipping — USDC delivered in full, and a synthetic token built to keep ten per cent was measured at exactly ten per cent. The negative control is what makes the clean result mean anything.
Because OFAC tags digital-currency entries by ledger and publishes no BASE tag. A sanctioned party controls the same private key on every EVM chain, so screening a Base address against the ETH-tagged entries is the correct thing to do — but it is an inference, and the evidence line says so rather than implying a Base-specific list exists. We also validate the list's size and shape before trusting it, because a truncated download of a large file still returns HTTP 200.
Because the mixed case IS a checksum. EIP-55 encodes one in the capitalisation of an otherwise case-insensitive string, so a mixed-case address that fails it has had a character transposed or dropped somewhere in transit. We refuse the request free, before any price is quoted, rather than confidently reporting on whatever address that typo happens to be. An all-lowercase address asserts no checksum and is accepted as-is.
5 Ounie credits for an address and 8 for a token contract — $0.05 and $0.08 in plain money, from the same wallet as every other Ounie app. No subscription, no minimum. Ask for kind auto and we reserve the larger price but bill whichever it turned out to be, refunding the difference to the exact pool it came from. Re-reading and listing checks you have already paid for is free forever.
Yes, and that is the answer worth the most. A high band is the reason to run the check at all. What is never charged is a check where the chain would not answer — that observed nothing, so it refunds in full on the credit rail and is refused before settlement on x402, where nothing can be refunded once it has moved.
Yes. The x402 endpoint takes USDC on Base with no account and no key — and the caller is already a wallet holding USDC on Base, so it is the one endpoint in the fleet whose audience is exactly its payment method. Pass kind explicitly there, as address or token: the two cost different amounts and a pay-per-call price has to be knowable before you sign for it. Auto stays on the credit rail, which can refund.
Base mainnet, and only Base. Every reader here was verified against it — the RPC failover, the proxy slot set, the delegation designator format, the state-override simulation. A chain we have not verified would produce answers we cannot stand behind, so it is refused rather than attempted.
5 credits an address. No subscription — pay in Ounie credits, from the same wallet as every other Ounie app.
A diligence signal, never a verdict on a counterparty, and never financial advice.