Pay-per-call KYC, AML, and regulatory risk assessment for AI agents. Priced in USDC on Base via the x402 protocol. Real OFAC SDN and UN Security Council sanctions data — no API keys, no monthly subscription.
Screen a person or entity against OFAC SDN and UN consolidated sanctions lists. Returns verification status, risk level (low/medium/high/critical), score 0–100, and per-match detail. Uses Jaro–Winkler fuzzy name matching.
POST /v1/kyc/checkFull sanctions + jurisdiction risk screening with an approve/review/reject recommendation. Accepts optional transaction context for audit trail.
POST /v1/aml/screenComposite report covering sanctions screening and multi-jurisdiction risk analysis. Designed for higher-stakes onboarding decisions.
POST /v1/risk/reportScreen a wallet address directly: OFAC sanctioned-address match plus on-chain exposure analysis — sanctioned counterparties, known-mixer (e.g. Tornado Cash) exposure, and flagged token holdings across Ethereum and Base. No entity name required.
POST /v1/wallet/screenRegister a wallet for ongoing monitoring across Ethereum and Base. Get alerts when it transacts with an OFAC-sanctioned address or known mixer. Poll for findings free at GET /v1/monitor/alerts.
POST /v1/monitor/registerThe TypeScript example below uses Coinbase's x402-fetch to wrap the standard fetch. It transparently handles the 402 challenge: the wrapper sees the 402, signs a USDC transfer with your viem wallet, and retries with an X-PAYMENT header. Your code just awaits a normal Response.
// npm install x402-fetch viem
import { wrapFetchWithPayment } from "x402-fetch";
import { createWalletClient, http, type Hex } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base } from "viem/chains";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as Hex);
const wallet = createWalletClient({ account, chain: base, transport: http() });
// Wrap fetch — pays up to $1 per call from this wallet
const payFetch = wrapFetchWithPayment(fetch, wallet, BigInt(1_000_000)); // 1 USDC = 1e6 in 6-decimal units
const res = await payFetch("https://api.netbrainis.co.za/v1/kyc/check", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
entity_name: "John Doe",
country: "US",
wallet_address: "0x1234...5678",
}),
});
const result = await res.json();
console.log(result);
// => { status: "verified", risk_level: "low", score: 15, sanctions_match: false, ... }
402 Payment Required with an x402 challenge in the body listing the price, network, asset, and pay-to address. x402-fetch signed an EIP-3009 USDC transfer with your viem wallet, encoded it as an X-PAYMENT header, and replayed the request. The compliance API verified the payment via a facilitator and ran the KYC check. The settled transaction hash is returned in the X-Payment-Tx response header.The same three operations are exposed as MCP tools at /mcp (streamable-http transport). The MCP server is a thin proxy — it forwards the caller's X-PAYMENT header to the underlying API. This keeps the compliance service scoped to compliance and lets the agent operator hold the wallet.
// The MCP server is added via the mcp_servers parameter on Anthropic's API.
// Your agent middleware injects X-PAYMENT on each MCP call so Claude doesn't
// need to know anything about x402.
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-opus-4-7",
max_tokens: 1024,
mcp_servers: [{
type: "url",
url: "https://api.netbrainis.co.za/mcp",
name: "compliance",
// Headers injected on every MCP request — produced by your x402 signer.
authorization_token: undefined,
headers: { "X-PAYMENT": await signX402ChallengeOnce(wallet) },
}],
messages: [{ role: "user", content: "Screen 'Acme Corp' for sanctions." }],
});
// OpenAI's Responses API accepts remote MCP servers via the tools array.
import OpenAI from "openai";
const openai = new OpenAI();
const response = await openai.responses.create({
model: "gpt-5",
tools: [{
type: "mcp",
server_label: "compliance",
server_url: "https://api.netbrainis.co.za/mcp",
headers: { "X-PAYMENT": await signX402ChallengeOnce(wallet) },
}],
input: "Screen 'Acme Corp' for sanctions.",
});
X-PAYMENT header authorizes one settlement. For multi-call sessions, use an x402 middleware layer (e.g. a small proxy in front of the MCP server, or x402-fetch wrapping your HTTP client) that signs a fresh header on each tool invocation. Coinbase's reference clients ship with this loop built in.Companion smart-contract layer for tokenized assets. Off-chain compliance results are signed as EIP-712 attestations and can be submitted on-chain by anyone — the operator pays zero gas.
x402 turns the dormant HTTP 402 status into a working payment protocol. No API keys to provision, no usage-based bills to reconcile, no per-customer onboarding. An agent with a funded wallet can transact with this service in milliseconds, the first time it discovers us. The same model scales from a single dev experiment to a production fleet of autonomous agents.
The MCP layer is there so Claude- and OpenAI-native agents can use the service without writing HTTP plumbing — they call kyc_check the same way they'd call weather or web_search. The caller-funded payment model preserves a clean separation: this server only does compliance.