---
title: "Multi-chain on-chain analytics for crypto trading agents, on-chain analysts, AML/compliance teams and DeFi BD. Covers Et"
method: POST
path: "/api/v1/call/crypto_wallet_intel"
tags: ["expertise"]
---

# Multi-chain on-chain analytics for crypto trading agents, on-chain analysts, AML/compliance teams and DeFi BD. Covers Et

`POST /api/v1/call/crypto_wallet_intel`

## Request

- Base URL: `https://mcp.gapup.io`
- URL: `https://mcp.gapup.io/api/v1/call/crypto_wallet_intel`
- Auth: HTTP bearer

Multi-chain on-chain analytics for crypto trading agents, on-chain analysts, AML/compliance teams and DeFi BD. Covers Ethereum, Base, Polygon, BSC, Arbitrum, Optimism — EVM-compatible addresses only.

5 modes:
• wallet_profile — full wallet summary: type (EOA/contract/CEX/protocol), inferred persona (whale/MEV-bot/DeFi-user/hodler…), age, tx count, native balance, ERC-20 count, NFT collections, OFAC sanctions flag
• token_flows — ERC-20 inflows/outflows per token on the selected period, priced in USD via CoinGecko
• pnl_estimate — FIFO realized + unrealized P&L on the period with confidence rating (high/medium/low)
• counterparties — top 20 counterparties ranked by USD volume with CEX/DEX/protocol labels
• defi_positions — active DeFi positions detected via Etherscan interaction history (Aave/Compound/Uniswap/Curve/Lido/Balancer/SushiSwap)

Signal detection (P0/P1/P2):
  P0 if OFAC SDN match OR direct Tornado Cash / sanctioned-protocol interaction
  P1 if >$1M volume on wallet <30 days old OR MEV-bot pattern OR >80% volume on single counterparty
  P2 informational (CEX wallet, new wallet, no anomaly)

Sources: Etherscan family (keyless free-tier, optional API key per chain), DefiLlama (keyless), public EVM RPC (keyless), CoinGecko free tier (keyless).
Cache TTL: 5 min (wallet activity evolves fast). Budget: 8s per source.

Env vars (all optional, raise Etherscan rate-limit from 1 req/5s to 5 req/s):
  ETHERSCAN_API_KEY · BASESCAN_API_KEY · POLYGONSCAN_API_KEY
  BSCSCAN_API_KEY · ARBISCAN_API_KEY · OPTIMISM_API_KEY

## Request body

- object
  - `mode` 'wallet_profile' | 'token_flows' | 'pnl_estimate' | 'counterparties' | 'defi_positions', required: Analysis mode. wallet_profile=full wallet summary + persona + sanctions flag. token_flows=ERC-20 inflows/outflows per token priced in USD. pnl_estimate=FIFO realized+unrealized P&L with confidence. counterparties=top 20 counterparties by volume. defi_positions=active positions on Aave/Compound/Uniswap/Curve/Lido/etc.
  - `address` string, required: EVM-compatible wallet address (0x... 40 hex chars). Works on all supported chains.
  - `chain` 'ethereum' | 'base' | 'polygon' | 'bsc' | 'arbitrum' | 'optimism' | 'all': Chain to analyze. Default "ethereum". Use "all" to scan all 6 chains (slower, ~30s).
  - `period_days` number: Lookback window in days for token_flows, pnl_estimate, counterparties, defi_positions. Default 30.
  - `min_value_usd` number: Minimum USD value filter for token_flows and counterparties. Default $100.
  - `async` boolean: If true, returns a job_id immediately (<200ms) instead of waiting for the result. Poll the result with job_result(job_id). Use for slow tools to avoid client timeouts.

## Response `200`

Tool result

- object
  - `tool` string
  - `result` object
    - `mode` string, required
    - `address` string, required
    - `chains_analyzed` string[], required
    - `wallet_profile` object
      - `address` string
      - `chains_active` string[]
      - `first_tx` string
      - `age_days` number
      - `total_tx_count` number
      - `native_balance_eth` number
      - `native_balance_usd` number
      - `erc20_count` number
      - `nft_collections_count` number
      - `inferred_type` string
      - `inferred_persona` string
      - `sanctions_flag` boolean
    - `token_flows` object[]
      - `token_symbol` string
      - `token_address` string
      - `inflows_usd` number
      - `outflows_usd` number
      - `net_usd` number
      - `tx_count` number
      - `last_tx_iso` string
    - `pnl_estimate` object
      - `period_days` number
      - `realized_pnl_usd` number
      - `unrealized_pnl_usd` number
      - `cost_basis_usd` number
      - `confidence` string
    - `counterparties` object[]
      - `address` string
      - `label` string
      - `volume_usd` number
      - `tx_count` number
      - `side` string
    - `defi_positions` object[]
      - `protocol` string
      - `chain` string
      - `type` string
      - `asset` string
      - `value_usd` number
      - `apy_pct` number
    - `signals` object[], required
      - `severity` string
      - `category` string
      - `message` string
    - `sources` object[], required
      - `name` string
      - `url` string
      - `status` string
    - `quality_score` number, required
    - `status` string, required
  - `request_id` string
  - `source` 'rest-api'
  - `ms` number

## Other responses

- `400`: Invalid arguments
- `401`: Unauthorized
- `402`: Payment Required — pay via x402 (USDC on Base) then retry with X-Payment header
- `404`: Tool not found
- `429`: Rate limited
- `500`: Internal error

---

[API](https://skmtc.dev/gapup/apis/gapup-mcp-rest-api.md) · [All operations](https://skmtc.dev/gapup/apis/gapup-mcp-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gapup/apis/gapup-mcp-rest-api/revisions/afb9da3b98f4?raw)
