law.sanctions-check

Fuzzy-match a name (person, company, vessel, aircraft) against the US Treasury OFAC Specially Designated Nationals list. POST { query, threshold?, limit?, sourceList? }. Returns ranked matches with similarity scores, entity type, sanctions programs, aliases, and remarks. Threshold default 0.4; scores ≥ 0.85 flagged as hasHighConfidenceMatch. List refreshed daily from public US Treasury data.

price
$0.0048 USDC per call
method
POST/api/law/sanctions-check
payment
x402 v2 · USDC on Base (EIP-3009) or Solana (SPL transfer)
auth
None. Sign the payment, retry with PAYMENT-SIGNATURE.

Overview

The sanctions screening API fuzzy-matches a name — person, company, vessel, or aircraft — against the US Treasury OFAC Specially Designated Nationals (SDN) list, the core check in AML and KYC workflows.

POST a query with an optional similarity threshold and result limit; results come back ranked by similarity score with entity type, sanctions programs, aliases, and remarks. Matches scoring at or above 0.85 are flagged as high-confidence so an agent can branch on a single boolean. The list is refreshed daily from public US Treasury data, and there is no API key or subscription — you pay per screen with x402.

Use cases

Parameters

NameTypeDescription
queryrequiredstring
min 2 chars · max 500 chars
thresholdnumber
min 0.1 · max 1
limitinteger
min 1 · max 100
sourceListstring
max 64 chars

Code samples

cURLbash
# 1. Probe the endpoint with no auth — receive 402 with PaymentRequirements
curl -sS -X POST 'https://2s.io/api/law/sanctions-check' \
  -H 'Content-Type: application/json' \
  -d '{"query":"xx","threshold":0.1,"limit":1,"sourceList":"example"}'

# 2. Sign the EIP-3009 transferWithAuthorization for the advertised price +
#    payTo from the 402 envelope, then retry with PAYMENT-SIGNATURE:
curl -sS -X POST 'https://2s.io/api/law/sanctions-check' \
  -H 'Content-Type: application/json' \
  -H 'PAYMENT-SIGNATURE: <base64-json-payload>' \
  -d '{"query":"xx","threshold":0.1,"limit":1,"sourceList":"example"}'

# Or just use the canonical runner — it handles the whole loop:
#   EVM_PRIVATE_KEY=0x... node --env-file=.env.local \
#     --experimental-strip-types scripts/x402-pay.ts \
#     'https://2s.io/api/law/sanctions-check'
TypeScript / Node — @2sio/sdktypescript
import { TwoS } from '@2sio/sdk'

const client = new TwoS({
  privateKey: process.env.EVM_PRIVATE_KEY as `0x${string}`,
})

const result = await client.law.sanctionsCheck({
  "query": "xx",
  "threshold": 0.1,
  "limit": 1,
  "sourceList": "example"
})

console.log('endpoint:', result.endpoint)
console.log('cost:', result.costUsd, 'USDC')
console.log('tx:', result.settlement?.txHash)
console.log('data:', result.data)
Python — 2siopython
import os
from twosio import TwoS

client = TwoS(private_key=os.environ["EVM_PRIVATE_KEY"])

result = client.law.sanctions_check(query="xx", threshold=0.1, limit=1, sourceList="example")

print("endpoint:", result.endpoint)
print("cost:", result.cost_usd, "USDC")
print("tx:", (result.settlement or {}).get("tx_hash"))
print("data:", result.data)
MCP — Claude Desktop / AgentKit / any MCP hostjson
// 1. Add @2sio/mcp to your MCP host config (Claude Desktop example below).
//    EVM_PRIVATE_KEY funds x402 payments per call.

// claude_desktop_config.json
{
  "mcpServers": {
    "2sio": {
      "command": "npx",
      "args": ["-y", "@2sio/mcp"],
      "env": { "EVM_PRIVATE_KEY": "0x..." }
    }
  }
}

// 2. Once the server is running, agents call this tool via standard MCP:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "law.sanctions-check",
    "arguments": {
      "query": "xx",
      "threshold": 0.1,
      "limit": 1,
      "sourceList": "example"
    }
  }
}
LangChain agent — langchain-twosiopython
# pip install langchain-twosio langchain-anthropic
import os
from langchain_twosio import get_twosio_tools
from langchain_anthropic import ChatAnthropic
from langgraph.prebuilt import create_react_agent

tools = get_twosio_tools(private_key=os.environ["EVM_PRIVATE_KEY"])
llm = ChatAnthropic(model="claude-haiku-4-5", temperature=0)
agent = create_react_agent(llm, tools)

# The agent will pick "twosio_law_sanctions_check" when the prompt matches.
result = agent.invoke({
    "messages": [("user", "...prompt that requires law.sanctions-check...")]
})
print(result["messages"][-1].content)
LlamaIndex agent — llama-index-tools-twosiopython
# pip install llama-index-tools-twosio llama-index-llms-anthropic
import asyncio, os
from llama_index_tools_twosio import get_twosio_tools
from llama_index.llms.anthropic import Anthropic
from llama_index.core.agent.workflow import FunctionAgent

tools = get_twosio_tools(private_key=os.environ["EVM_PRIVATE_KEY"])
llm = Anthropic(model="claude-haiku-4-5")
agent = FunctionAgent(tools=tools, llm=llm)

# The agent will pick "twosio_law_sanctions_check" when the prompt matches.
response = asyncio.run(agent.run("...prompt that requires law.sanctions-check..."))
print(response)

Response

FieldTypeDescription
okboolean
one of: true
itemsarray
totalintegerTotal matching rows upstream; null when unknown.
sourceobject
metaobject
Example response datajson
{
  "ok": true,
  "items": [
    {}
  ],
  "total": 1,
  "source": {
    "provider": "example",
    "url": "example",
    "license": "example"
  },
  "meta": {
    "query": "example",
    "threshold": 1,
    "hasHighConfidenceMatch": false,
    "list": "example",
    "refreshCadence": "example"
  }
}

FAQ

Which sanctions list does this check?
The US Treasury OFAC Specially Designated Nationals (SDN) list, refreshed daily from public Treasury data.
How does the match scoring work?
Each result carries a similarity score; the default threshold is 0.4. Results scoring ≥ 0.85 are flagged with hasHighConfidenceMatch so you can act on a single boolean.
Is this a substitute for a full compliance program?
It is one screening signal against the OFAC SDN list. Treat hits as inputs to your own AML/KYC process and human review, not as standalone compliance decisions.
Do I need an API key to use the sanctions check API?
No. law.sanctions-check is x402-native — there is no signup and no API key. Your client makes the call, receives a 402 with payment requirements, signs a USDC payment, and retries. Funds come from a wallet you control.
How much does the sanctions check API cost?
$0.0048 USDC per call, charged per request. There are no monthly fees, seats, or minimums — you pay only for the calls you make.
Can I try the sanctions check API for free first?
Yes. Add ?trial=1 (or the header X-2s-Trial: 1) to get a free real call per endpoint per hour, so you can verify the response shape before wiring payment.
Which networks and tokens are supported?
USDC on Base (via EIP-3009 transferWithAuthorization) or Solana (SPL transfer), using the open x402 payment protocol.
How do I call law.sanctions-check from an AI agent or MCP host?
Use @2sio/sdk (TypeScript), 2sio (Python), or the @2sio/mcp server for any MCP host — each handles the probe → sign → retry loop for you. See the code samples on this page.

Discovery

Related: sanctions screening api · ofac api · ofac sdn api · sanctions check api · aml screening api · sanctions api for ai agents · x402 sanctions api · watchlist screening api · law sanctions check api · sanctions check api for ai agents · x402 law api · sanctions check api no api key · pay per call sanctions check api · law api