Sanctions Screen: Vendor Documentation

nsgoods.org · service: https://sanctions.nsgoods.org/screen

What the service is

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.

What each path queries

InputMatched againstHowVerdict
EVM address (0x-hex)Local OFAC SDN snapshotCase-insensitive value matchdeny if the value is in the snapshot, else clean
Solana, BTC, other base58 or bech32Local OFAC SDN snapshotCase-sensitive value matchSame 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.

What the signature proves, and what it does not

Every response is signed with an Ethereum EIP-191 personal_sign by a fixed signer, 0x57fF0F084Cba33e6761503f90eEF0Da9F159350c, published in our proof manifest.

Proves:

Does not prove:

Freshness

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.

Archiving and offline verification

A stored signed response stays verifiable for years, with no call back to us, even after a key rotation.

  1. Keep the full response body, all twelve fields, exactly as received.
  2. Remove the signature and signed_by fields.
  3. Re-serialise the rest as canonical JSON: keys sorted, compact separators, non-ASCII escaped. Recover the signer from the EIP-191 signature over that string.
  4. Compare the recovered address to 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.

Contract stability

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.

Pricing

$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.