Catalog/chain-approvals

Chain

ERC-20/721 token approval and revoke risk scanner API

Scans an EVM address's ERC-20 Approval and ERC-721/1155 ApprovalForAll logs over public RPC across a capped recent block range, reduces them to current live allowances, flags unlimited approvals and unknown or risky spenders by cross-referencing a curated label set, and returns a prioritized revoke report — the scan plus the risk rules collapsed into one actionable answer. Answers 'Which token approvals does this wallet have live and which are unlimited?', 'What should I revoke first?'.

Price$0.01per request
MethodPOST
Route/v1/chain/approvals
StatusLive
MIME typeapplication/json
Rate limit60/minute
Cache300s public
chainapprovalsallowancerevokeerc20securitydefiwallet
API URLhttps://x402.hexl.dev/v1/chain/approvals
Integration docs
Example request
{
  "address": "0xabababababababababababababababababababab",
  "chain": "base"
}
Example response
{
  "address": "0xabababababababababababababababababababab",
  "approvals": [
    {
      "token": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
      "spender": "0xcccccccccccccccccccccccccccccccccccccccc",
      "spenderLabel": null,
      "spenderCategory": "unknown",
      "allowance": "unlimited",
      "isUnlimited": true,
      "type": "erc20",
      "risk": "high",
      "riskNote": "unlimited allowance to an unlabelled spender"
    },
    {
      "token": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
      "spender": "0x7a250d5630b4cf539739df2c5dacb4c659f2488d",
      "spenderLabel": "Uniswap V2 Router",
      "spenderCategory": "contract",
      "allowance": "1000",
      "isUnlimited": false,
      "type": "erc20",
      "risk": "low",
      "riskNote": "bounded allowance to contract Uniswap V2 Router"
    }
  ],
  "approvalCount": 2,
  "unlimitedCount": 1,
  "riskyCount": 1,
  "recommendation": "Revoke 1 risky approval(s) immediately — 1 are unlimited. Prioritise unknown/high-risk spenders.",
  "chain": "base",
  "scannedFromBlock": 10200000,
  "scannedToBlock": 11500000,
  "maxUint256": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
}
Input schema
{
  "type": "object",
  "required": [
    "address"
  ],
  "properties": {
    "address": {
      "type": "string",
      "description": "0x-prefixed 40-hex EVM address (token owner) to scan."
    },
    "chain": {
      "type": "string",
      "enum": [
        "base",
        "ethereum",
        "arbitrum",
        "optimism",
        "polygon"
      ],
      "default": "base",
      "description": "Chain to scan on."
    },
    "lookbackBlocks": {
      "type": "integer",
      "minimum": 1,
      "description": "Optional block lookback window (capped server-side)."
    }
  },
  "examples": [
    {
      "address": "0xabababababababababababababababababababab",
      "chain": "base"
    }
  ]
}
Output schema
{
  "type": "object",
  "additionalProperties": true
}