nsgoods.org · service: https://sanctions.nsgoods.org/screen
Sanctions Screen answers one narrow question per call: is this exact blockchain address present in the U.S. Treasury OFAC SDN list right now. It is an exact-address lookup against the OFAC Specially Designated Nationals list ("Digital Currency Address" entries), and nothing more. It does not run Chainalysis, on-chain behavioural analysis, heuristics, or transaction tracing. A "clean" result means only that the exact address string is absent from the current OFAC SDN snapshot. It is negative evidence: it can push a decision toward deny, never toward allow. It is not KYC, not Travel Rule, not a safety or legitimacy rating, and not legal advice. Every response carries this disclaimer inline.
| Input | Matched against | How | Verdict |
|---|---|---|---|
| EVM address (0x-hex) | Local OFAC SDN snapshot | Case-insensitive value match | deny if the value is in the snapshot, else clean |
| Solana, BTC, other base58 or bech32 | Local OFAC SDN snapshot | Case-sensitive value match | Same rule |
Matching is global by address value. The chain parameter is echoed back but is advisory only, so a mislabelled chain can never hide a real SDN hit. There is no Chainalysis path and no on-chain call on either route. Readers coming from our payability product should note that the "absent token account does not mean never existed" rule belongs to that separate service, not here; Sanctions Screen does no on-chain state check at all.
Every response is signed with an Ethereum EIP-191 personal_sign by a fixed signer, 0x57fF0F084Cba33e6761503f90eEF0Da9F159350c, published in our proof manifest.
Proves:
sdn_snapshot_at inside the signed body.Does not prove:
sdn_snapshot_at is the time the underlying OFAC data last changed and was ingested; it advances only when OFAC republishes. The snapshot is fingerprinted by total_sdn_addresses and the per-chain counts in coverage. We store the Treasury ETag internally for conditional fetches. We do not currently emit a source file hash in the response, and we prefer to say so plainly rather than imply one.
The source is re-checked every six hours (01, 07, 13, 19 UTC) with a conditional request, and a liveness heartbeat records the last successful check. Known limit, stated to integrators up front: sdn_snapshot_at measures when the data last changed, not when we last checked. OFAC often returns "not modified" for days, so a snapshot older than 24 hours is normal and does not mean the check is stale. The health signal is the last successful fetch time, not the snapshot age.
A stored signed response stays verifiable for years, with no call back to us, even after a key rotation.
signature and signed_by fields.signed_by and to the signer pinned in our proof manifest.Rotation does not break old receipts: our manifest keeps a rotated signer alongside the new one with a validity boundary, so an archived response still verifies against the signer valid at its sdn_snapshot_at. For long-term audit, store a manifest snapshot with the response.
The paid response is a frozen twelve-key object: address, chain, sanctioned, matched_label, verdict, sdn_snapshot_at, sources, coverage, disclaimer, generated_at, signed_by, signature. The OFAC numbers inside move; the shape does not. A change to the shape happens only at a version boundary, announced with a window, never silently. An unannounced change to the signer or the shape should be treated as a compromise and failed closed, the same as a signature mismatch.
$0.005 USDC per call, payable on Solana or Base via x402. No subscription, no minimum. A free locked preview at /screen/preview returns a fixed signed example so you can test the response format and signature path before paying.