给你的 Agent / 系统装上付款前风险检查
同一套我们自己在用的地址风险判断,开放成免费 API:免注册、支持跨域(CORS)、返回可核验证据。直接嵌进你的系统或 AI Agent 的结算前流程。付款前先问一句「这个对手方安不安全」。
免注册 · 免费
留个邮箱:每月 5,000 次高速
注册表 Agent:每月 50,000 次
需要更多额度?
支持跨域 CORS
给证据,不只给分
机器可读规范
/openapi.json →输出语言
/api/decide付款前调一次(决策)
你的 agent 正要付一笔——先问一句能不能付。返回机器可执行决策 allow / review / decline + 可核证据 + retry 语义;allow/review 还带一张可核验的结算凭证(绑到你的结算上)。免费、无需 key。付费带结算版见 /api/x402/decision。
curl "https://oceanalt.com/api/decide?to=0x8589427373D6D84E98730D7795D8f6f8731FDA16"{
"decision": "decline", // allow | review | decline
"allow": false, // one-line gate: if (!allow) halt()
"address": "0x8589...FDA16",
"verdict": "risky",
"risk": 100,
"evidence": [ { "label": "hit mixer list", "detail": "Tornado Cash", "url": "..." } ],
"retry_hint": "Do not retry; use a different payee.",
"disclaimer": "OceanAlt has denied this service request. ...", // on decline
"intelligence": { "sources": [ /* OceanAlt AML + external adapter status */ ] },
"tier": "free",
"upgrade": "POST /api/x402/decision — same decision, plus settles on x402."
// on allow/review: also "settlement": { "attestation_id", "verify_url", ... }
}/api/payee/decide收款方也要过闸(收款方三态决策)
另一半:付款 Agent 结算前先问收款方接不接这笔钱。返回 accept / decline / hold_request_info / not_ready + 原因码 + requested_fields + 证据 + 签名。全部是规则:收款方就绪度来自注册表四级阶梯,付款方地址反向筛查,金额区间 / 用途 / KYA 要求来自收款方自己设的策略。免费、无需 key。
curl -X POST "https://oceanalt.com/api/payee/decide" -H "content-type: application/json" -d '{"payee":"oceanalt-200lab-premium","payer":{"address":"0x8589427373D6D84E98730D7795D8f6f8731FDA16"},"amountUsdc":5,"purpose":"api-call"}'{
"status": "decline", // accept | decline | hold_request_info | not_ready
"final": true,
"reasons": [ "PAYER_SANCTIONED" ],
"requested_fields": [], // only on hold_request_info
"decision_id": "pd_…",
"expires_at": null, // 48h on hold_request_info
"payee_ref": { "sid": "…", "rating_status": "verified", "open_disputes": 0, "policy": { "min_usdc": null, "max_usdc": null, "require_kya": false, "purposes": [] } },
"evidence": [ { "kind": "registry", "ref": "…/registry.json#sid", "complete_through": "…" }, { "kind": "screening", "ref": "…/api/risk?addr=…", "complete_through": "…" } ],
"signature": { "token": "…", "verify_url": "…/api/attestation/verify?token=…" },
"next": "Do not settle. Re-paying does not change this result."
}/api/risk单地址查询
付款前查一个收款地址:是否命中制裁 / 混币器 / 我方风险名单,或链上高危信号?返回判定 + 可核验证据。
curl "https://oceanalt.com/api/risk?addr=0x8589427373D6D84E98730D7795D8f6f8731FDA16&network=ethereum"{
"address": "0x8589...FDA16",
"verdict": "risky", // risky | caution | clear
"risk": 100, // 0-100
"blocked": true, // does the gateway block it?
"signals": ["mixer contract"],
"evidence": [ // click-through, verifiable
{ "label": "hit mixer list", "detail": "Tornado Cash",
"url": "https://etherscan.io/address/0x8589..." }
],
"advice": "Decline. ...",
"standard": "https://oceanalt.com/en/rap"
}/api/risk/batch批量查询
一次查一串地址(自动去重,最多 25 个)。适合 OTC 收款台 / 系统批处理。结果按 高危 → 谨慎 → 清白 排序。
curl -X POST "https://oceanalt.com/api/risk/batch" \
-H "content-type: application/json" \
-d '{"addresses":["0x8589...","TWd4...","T..."]}'{
"summary": { "total": 3, "risky": 1, "caution": 0, "invalid": 1 },
"results": [
{ "address": "0x8589...", "verdict": "risky", "risk": 100,
"blocked": true, "top": "mixer contract" },
{ "address": "TWd4...", "verdict": "clear", "risk": 3,
"blocked": false, "top": "has prior activity" }
]
}/api/risk/flow资金流分析(波场 + EVM)
波场 USDT 地址:上下游对手方(按金额 top 8)、第一笔 U 来源、被 Tether 冻结的对手方标记、跨链桥识别。EVM(ethereum/base/polygon/arbitrum/optimism,传 network)给 USDT/USDC 上下游 + 桥识别。
curl "https://oceanalt.com/api/risk/flow?addr=TWd4WrZ9wn84f5x1hZhL4DHvk738ns5jwb"{
"chain": "tron",
"total": 10000,
"inbound": [ { "address": "T...", "tag": "Binance-Hot",
"count": 17, "usdt": 2890000, "risky": false } ],
"outbound": [ { "address": "T...", "tag": "OKX Hot",
"count": 25, "usdt": 3370000, "risky": false } ],
"firstInflow": { "from": "T...", "usdt": 500, "date": "2024-06-01" },
"riskyParties": 0
}幂等键:安全地重试付款
网络中断时,你的 Agent 不知道付款请求到底执行了没有。给 POST /api/pay 的付款调用(以及 rotate)带上 Idempotency-Key 请求头,重试时保持同一个 key、同一个 nonce、同样的请求体:24 小时内我们原样返回第一次的响应,不会重复执行,也不会把这次重试记成重放攻击。语义参照 IETF 草案 draft-ietf-httpapi-idempotency-key-header。
curl -X POST "https://oceanalt.com/api/pay" \
-H "content-type: application/json" \
-H "x-agent-secret: $OCEANALT_AGENT_SECRET" \
-H "Idempotency-Key: 8e03978e-40d5-43e8-bc93-6894a57f9324" \
-d '{"agentId":"my-agent","amountUsdc":1,"to":"0x…","purpose":"api-credits","nonce":"b3f1c2…"}'Idempotent-Replayed: true— 同 key、同请求体、同凭证的重试:原样返回第一次的状态码和响应体。422idempotency_key_reused— 同一个 key 用在了不同的请求体上(比如重试时换了 nonce)。没有执行。409idempotency_request_in_progress— 第一次请求还在处理中。这是并发,不是重放攻击,不记威胁。等 retry-after 秒后原样重发。400idempotency_key_invalid— key 需为 1–255 个可打印 ASCII 字符,建议用 UUID。
Webhook 签名与验签
在控制台(/keys)配置了 webhook 的,你的 Agent 付款被拦下时,我们会 POST 一段 JSON 到你的地址。每条消息都按 Standard Webhooks 规范签名,你的系统可以确认它真的来自 OceanAlt、没有被改过、不是旧消息重放。
webhook-id— 消息唯一编号;同一条消息重试时不变,请按它去重。webhook-timestamp— 发送时间(Unix 秒)。与你的当前时间相差超过 5 分钟就拒绝。webhook-signature—v1,<base64>:对「webhook-id.webhook-timestamp.原始请求体」做 HMAC-SHA256,密钥是 whsec_ 之后那段 base64 解码出的字节。轮换密钥后 24 小时内会带两个签名(空格分隔),任一匹配即可。
import { createHmac, timingSafeEqual } from "node:crypto";
// secret: the whsec_… value shown once in the console
// rawBody: the request body exactly as received (do NOT JSON.parse and re-stringify it)
export function verifyOceanAltWebhook(secret, headers, rawBody, toleranceSec = 300) {
const id = headers["webhook-id"];
const ts = headers["webhook-timestamp"];
const sigs = headers["webhook-signature"];
if (!id || !ts || !sigs) return false;
if (Math.abs(Date.now() / 1000 - Number(ts)) > toleranceSec) return false; // stale or replayed
const key = Buffer.from(secret.slice("whsec_".length), "base64");
const expected = createHmac("sha256", key).update(id + "." + ts + "." + rawBody).digest();
// during a rotation there are two space-separated signatures; accept if either matches
return sigs.split(" ").some((entry) => {
const [version, b64] = entry.split(",");
const got = Buffer.from(b64 || "", "base64");
return version === "v1" && got.length === expected.length && timingSafeEqual(got, expected);
});
}
// Express example:
// app.post("/hooks/oceanalt", express.raw({ type: "application/json" }), (req, res) => {
// const raw = req.body.toString("utf8");
// if (!verifyOceanAltWebhook(process.env.OCEANALT_WEBHOOK_SECRET, req.headers, raw)) return res.sendStatus(401);
// const event = JSON.parse(raw); // then deduplicate on req.headers["webhook-id"]
// res.sendStatus(204);
// });给密钥上三道锁:能力范围、IP 白名单、过期时间
密钥默认什么都不限,你已经在用的密钥不受影响。持有者可以自己加上限制。它们决定这把密钥万一泄露,对方能拿它做多少事。
screen_address— 查地址:单个收款地址筛查(?on= 时点查询不读密钥,不受影响)screen_endpoint— 查付款网址:这个端点是不是已知钓鱼站decide— 付款前判决:allow / review / decline(含可选的付款意图检查)payee_decide— 收款方决策:接不接这笔钱batch_screen— 批量筛查:一次最多 25 个地址(付费的 POST /api/x402/batch 按付款认,不读密钥)trace_funds— 资金流追踪:多跳沾染追踪与上下游对手方分析(同一份上游资金数据的两种看法,合成一组)evidence_bundle— 证据包:一个地址的 Ed25519 签名证据包intent_check— 盲签比对:这段 calldata 真正会执行什么,与你声称要付的那笔对不对得上baseline_lookup— 控制基线查询:结算前查对手方自证过哪些控制项
403key_scope_denied— 这次调的接口不在这把密钥的范围里。返回里写明是哪个范围、这把密钥允许哪些。403key_ip_denied— 请求不是从白名单里的地址发出的。最多 20 条,可写单个地址或网段(CIDR,例如 198.51.100.0/24);IPv4 与 IPv6 分开算。我们认的是连接真正来自哪里,请求头里自称的 X-Forwarded-For 不算数。200access.key_rejected = expired— 过了持有者设的过期时间。和被停用是同一个待遇:调用仍然按匿名档服务,但明确告诉你密钥没被认,不会闷声降级让你去自己代码里找 bug。
curl "https://oceanalt.com/api/access-keys/settings" -H "authorization: Bearer $OCEANALT_API_KEY"
curl -X POST "https://oceanalt.com/api/access-keys/settings" \
-H "authorization: Bearer $OCEANALT_API_KEY" \
-H "content-type: application/json" \
-d '{"scopes":["screen_address","decide"],"ip_allowlist":["198.51.100.0/24"],"expires_at":"2027-01-01T00:00:00Z"}'判定含义
- risky — 命中制裁 / 混币器 / 我方风险名单,或链上高危 → 建议拒付。
- caution — 存在风险信号 → 只在授权额度内谨慎处理。
- clear — 筛查完成,未见风险信号。注意:没查到信号 ≠ 一定安全。
- uncertain — 筛查没能完成(上游数据这一刻拿不到)。没有风险分。请稍后重试,绝不能当成 clear 处理。
支持的网络
8 条 EVM 链 + 波场 TRON + Solana。制裁 / 混币器 / 诈骗名单判定与链无关(全网通用);链上信号与稳定币(USDT/USDC)发行方冻结按对应链实时查、可点开核验。
ethereum·base·bsc·polygon·arbitrum·optimism·avalanche·arctron(USDT-TRC20 冻结 / 深度追踪 / 资金流) ·solana(制裁名单)
x402 付费高阶(按次付费 · 免注册免 key)
更重的分析走 x402:HTTP 402 → 签一次 USDC 授权 → 200。facilitator 代验签、代付 gas、不托管你的资金。用 oceanalt-aml SDK 一行搞定,或任意 x402 客户端。
-
/api/x402/decision— 完整网关合规判决(allow/review/decline)+ 证据 · $0.30 -
/api/x402/trace?addr=T…— 波场多跳沾染追踪(≤3 跳) · $0.20 -
/api/x402/batch— 批量筛查(≤25) · $0.10
SDK 与 MCP(装进你的 Agent)
npm i oceanalt-aml
import { OceanAltAML } from "oceanalt-aml";
const aml = new OceanAltAML();
const r = await aml.screen("0x…", { network: "optimism" }); // free
const d = await aml.decision({ to: "0x…", amountUsdc: 25 }, // paid (x402)
{ privateKey: process.env.PAYER_KEY });{
"mcpServers": {
"oceanalt-aml": {
"command": "npx", "args": ["-y", "oceanalt-aml-mcp"],
"env": { "OCEANALT_PAYER_KEY": "0x…" }
}
}
}
