OceanAltOceanAlt

开发者 · 免费 API

给你的 Agent / 系统装上付款前风险检查

同一套我们自己在用的地址风险判断,开放成免费 API:免注册、支持跨域(CORS)、返回可核验证据。直接嵌进你的系统或 AI Agent 的结算前流程。付款前先问一句「这个对手方安不安全」。

免注册 · 免费

直接调用,无需 API key(每分钟 60 次,每月 2,000 次,按来源 IP 计量)。

留个邮箱:每月 5,000 次高速

自助拿一把密钥,请求头带 Authorization: Bearer:每分钟 180 次。用完只降速到每分钟 60 次,接口不会停。

注册表 Agent:每月 50,000 次

已在注册表登记过 Agent 的,直接用它的凭证(x-agent-id + x-agent-secret):每分钟 300 次,额度按主体聚合。不用再申请第二把钥匙。

需要更多额度?

上面三档就是全部,而且都免费 —— 我们没有付费档。用量比这更大的,去 /pricing 告诉我们你要做什么、量多少,我们按你的场景回你。

支持跨域 CORS

浏览器 / agent / 服务端都能直接请求。

给证据,不只给分

命中哪个名单、链上路径,都能点开核验。

想提额度? 留个邮箱自助拿一把密钥 → 密钥只在邮件里出现一次,我们这边只存哈希值。

机器可读规范

OpenAPI 3.1,让 Agent 自动发现参数和返回结构,不用读人话去猜。

/openapi.json →

输出语言

人读字段默认英文,加 lang=zh 给中文。另返回 signal_keys(与语言无关的信号键),Agent 请按它做判断,别去解析人话。

GET / POST/api/decide

付款前调一次(决策)

你的 agent 正要付一笔——先问一句能不能付。返回机器可执行决策 allow / review / decline + 可核证据 + retry 语义;allow/review 还带一张可核验的结算凭证(绑到你的结算上)。免费、无需 key。付费带结算版见 /api/x402/decision。

参数

  • to 必填 — 将要付款的收款地址:0x 以太坊系 / T 波场 TRON
  • amountUsdc 可选 — 金额(USDC,选填,仅记录)
  • purpose 可选 — 用途备注(选填)
  • network 可选 — 0x 地址所在 EVM 链(同 /api/risk)
  • task 可选 — 付款意图:这笔钱是为了什么(选填;带了任一意图字段就多做一层意图检查,空的会被要求补充)
  • reasoning 可选 — 付款意图:为什么付给这个收款方(选填)
  • maxAmountUsdc 可选 — 调用方声明的单笔上限(USDC,选填);实付超过即 decline

示例

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", ... }
}
GET / POST/api/payee/decide

收款方也要过闸(收款方三态决策)

另一半:付款 Agent 结算前先问收款方接不接这笔钱。返回 accept / decline / hold_request_info / not_ready + 原因码 + requested_fields + 证据 + 签名。全部是规则:收款方就绪度来自注册表四级阶梯,付款方地址反向筛查,金额区间 / 用途 / KYA 要求来自收款方自己设的策略。免费、无需 key。

参数

  • payee 必填 — 注册表里的收款方 sid(见 /registry.json)
  • payer.address 可选 — 付款方地址(会反向做 AML 筛查)
  • payer.agentId 可选 — 付款 Agent 的 KYA 标识(收款方要求 KYA 时必填)
  • amountUsdc 可选 — 金额(收款方设了区间时必填)
  • purpose 可选 — 用途(收款方设了用途白名单时必填)

示例

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."
}
GET/api/risk

单地址查询

付款前查一个收款地址:是否命中制裁 / 混币器 / 我方风险名单,或链上高危信号?返回判定 + 可核验证据。

参数

  • addr 必填 — 要查的地址:0x 以太坊系 / T 波场 TRON / Solana base58
  • network 可选 — 0x 地址所在 EVM 链:ethereum(默认)/ base / bsc / polygon / arbitrum / optimism / avalanche / arc

示例

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"
}
POST/api/risk/batch

批量查询

一次查一串地址(自动去重,最多 25 个)。适合 OTC 收款台 / 系统批处理。结果按 高危 → 谨慎 → 清白 排序。

参数

  • addresses 必填 — 地址数组(JSON body),最多 25 个

示例

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" }
  ]
}
GET/api/risk/flow

资金流分析(波场 + EVM)

波场 USDT 地址:上下游对手方(按金额 top 8)、第一笔 U 来源、被 Tether 冻结的对手方标记、跨链桥识别。EVM(ethereum/base/polygon/arbitrum/optimism,传 network)给 USDT/USDC 上下游 + 桥识别。

参数

  • addr 必填 — 波场 TRON 地址(T 开头)或 0x EVM 地址
  • network 可选 — 0x 地址所在 EVM 链(ethereum 默认 / base / polygon / arbitrum / optimism);波场无需填

示例

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、同请求体、同凭证的重试:原样返回第一次的状态码和响应体。
  • 422 idempotency_key_reused — 同一个 key 用在了不同的请求体上(比如重试时换了 nonce)。没有执行。
  • 409 idempotency_request_in_progress — 第一次请求还在处理中。这是并发,不是重放攻击,不记威胁。等 retry-after 秒后原样重发。
  • 400 idempotency_key_invalid — key 需为 1–255 个可打印 ASCII 字符,建议用 UUID。

回放必须出示与第一次相同的 x-agent-secret,只知道 key 的人拿不到你的响应。不带这个头的调用,行为与以前完全一样。要发起一笔新的付款,请换新的 key 和新的 nonce。

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 小时内会带两个签名(空格分隔),任一匹配即可。

Node 验签示例(零依赖,这段代码在我们的自测里原样跑过):

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);
// });

也可以用任意 Standard Webhooks 库验签(standardwebhooks.com),把控制台给你的 whsec_ 密钥传进去即可。

签名密钥在控制台生成,只显示一次,可随时轮换。收件方要在约 5 秒内回 2xx;没送到的会在 1 分钟、5 分钟、30 分钟、2 小时后自动重试,最多共 5 次,不跟随重定向。每次尝试的状态码、耗时和错误摘要都在控制台的「最近投递」里,保留 30 天。

给密钥上三道锁:能力范围、IP 白名单、过期时间

密钥默认什么都不限,你已经在用的密钥不受影响。持有者可以自己加上限制。它们决定这把密钥万一泄露,对方能拿它做多少事。

能力范围(scope):这把密钥能调哪些接口

  • screen_address — 查地址:单个收款地址筛查(?on= 时点查询不读密钥,不受影响)GET /api/risk
  • screen_endpoint — 查付款网址:这个端点是不是已知钓鱼站GET /api/endpoint
  • decide — 付款前判决:allow / review / decline(含可选的付款意图检查)GET /api/decide · POST /api/decide
  • payee_decide — 收款方决策:接不接这笔钱POST /api/payee/decide
  • batch_screen — 批量筛查:一次最多 25 个地址(付费的 POST /api/x402/batch 按付款认,不读密钥)POST /api/risk/batch
  • trace_funds — 资金流追踪:多跳沾染追踪与上下游对手方分析(同一份上游资金数据的两种看法,合成一组)GET /api/risk/trace · GET /api/risk/flow
  • evidence_bundle — 证据包:一个地址的 Ed25519 签名证据包GET /api/evidence/bundle
  • intent_check — 盲签比对:这段 calldata 真正会执行什么,与你声称要付的那笔对不对得上POST /api/intent/check
  • baseline_lookup — 控制基线查询:结算前查对手方自证过哪些控制项GET /api/baseline/lookup

上面没列出来的接口不读密钥,按来源 IP 限流:x402 付费端点(按付款认,本来就不需要密钥)、时点查询 GET /api/risk?on=,以及网关、履约、注册表那几个接口。MCP 端点 POST /api/mcp 是可选的:不带密钥照常全部可用;带了密钥,工具调用按密钥限流,持有者设的能力范围和 IP 白名单按工具生效,判决可进决策日志(这是我们自己发的密钥,不是 MCP 规范里的 OAuth 授权)。另外,这三道锁管的是「这把密钥能做什么」,不是「能做多少」:2026-09-16 新纳入的六个接口仍按来源 IP 限流、仍不计入任何人的月额度,不带密钥调它们,和以前一模一样。Agent 凭证(x-agent-id + x-agent-secret)是另一套,不受这些限制影响。决策日志默认关闭,持有者自己打开后才记录,可用 GET /api/access-keys/decisions 导出(JSON 或 CSV,整份签名)。

  • 403 key_scope_denied — 这次调的接口不在这把密钥的范围里。返回里写明是哪个范围、这把密钥允许哪些。
  • 403 key_ip_denied — 请求不是从白名单里的地址发出的。最多 20 条,可写单个地址或网段(CIDR,例如 198.51.100.0/24);IPv4 与 IPv6 分开算。我们认的是连接真正来自哪里,请求头里自称的 X-Forwarded-For 不算数。
  • 200 access.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 · arc
  • tron (USDT-TRC20 冻结 / 深度追踪 / 资金流) · solana (制裁名单)

x402 付费高阶(按次付费 · 免注册免 key)

更重的分析走 x402:HTTP 402 → 签一次 USDC 授权 → 200。facilitator 代验签、代付 gas、不托管你的资金。用 oceanalt-aml SDK 一行搞定,或任意 x402 客户端。

  • POST /api/x402/decision — 完整网关合规判决(allow/review/decline)+ 证据 · $0.30
  • GET /api/x402/trace?addr=T… — 波场多跳沾染追踪(≤3 跳) · $0.20
  • POST /api/x402/batch — 批量筛查(≤25) · $0.10

机器可读清单(免费 vs 付费 / 网络 / facilitator / 定价):/api/x402

x402 是什么 + 浏览器里实测合规预检:/zh/x402

SDK 与 MCP(装进你的 Agent)

① 编程 SDK(Node / 浏览器 / Deno / Bun,免费路径零依赖):

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 });

② MCP server(让 Claude / 任意 MCP 客户端原生调用):

{
  "mcpServers": {
    "oceanalt-aml": {
      "command": "npx", "args": ["-y", "oceanalt-aml-mcp"],
      "env": { "OCEANALT_PAYER_KEY": "0x…" }
    }
  }
}

免费工具:screen_address、recent_flagged;付费工具:compliance_decision、deep_trace、batch_screen(需 OCEANALT_PAYER_KEY)。

合理使用:免费供个人与集成测试。大流量 / 商用请联系我们。本接口给风险信号,不构成投资 / 交易建议。

x402 生态可调用(免费):我们把 AML 声明为 x402 资源、price=0,Agent 无需付费、无需 key 直接调用。机器可读清单:/api/x402。

→ 先在网页里试试查地址 · 完整合规网关(11 道闸) · RAP 标准