Interpreted crypto wallet data for AI agents. Use when an agent needs portfolio values, token positions, DeFi positions, NFT holdings, transaction history, PnL data, token prices, charts, gas prices, swap quotes, or DApp information across 41+ chains. Zerion transforms raw blockchain data into agent-ready JSON with USD values, protocol labels, and enriched metadata. Supports x402 pay-per-request ($0.01 USDC on Base) and API key access. Triggers on mentions of portfolio, wallet analysis, positions, transactions, PnL, profit/loss, DeFi, token balances, NFTs, swap quotes, gas prices, or Zerion.
Zerion provides interpreted, enriched crypto wallet data across 41+ chains including Ethereum, Base, Arbitrum, Optimism, Polygon, Solana, and more.
Unlike raw RPC data, Zerion returns:
group_id)Two ways to access:
Zerion is the research layer. Use it to analyze wallets, find opportunities, track PnL. Then hand off to Bankr for execution (swaps, stop-losses, DCA).
Zerion (Research) Bankr (Execute)
───────────────── ────────────────
Portfolio analysis → Rebalance trades
PnL tracking → Stop-loss orders
Position monitoring → Take-profit orders
Whale watching → Copy trades
Swap quotes → Execute best route
NFT floor tracking → Buy/sell NFTs
npm install -g zerion-cli
# Set API key
export ZERION_API_KEY="zk_..."
# Or use x402 (no key needed)
zerion-cli wallet portfolio 0x... --x402
# Commands
zerion-cli wallet portfolio <address> # Total USD value
zerion-cli wallet positions <address> # All token positions
zerion-cli wallet transactions <address> # Transaction history
zerion-cli wallet pnl <address> # Profit & loss
zerion-cli wallet analyze <address> # Full analysis
zerion-cli chains list # Supported chains
Returns aggregated portfolio value across all chains.
curl "https://api.zerion.io/v1/wallets/0x.../portfolio?currency=usd" \
-H "Authorization: Basic $(echo -n $ZERION_API_KEY: | base64)"
Response:
{
"data": {
"attributes": {
"total": { "positions": 44469.60 },
"positions_distribution_by_type": {
"wallet": 40000,
"deposited": 3000,
"staked": 1469.60
},
"positions_distribution_by_chain": {
"base": 27495.06,
"ethereum": 6216.25,
"arbitrum": 1234.56
},
"changes": {
"absolute_1d": 305.86,
"percent_1d": 0.69
}
}
}
}
Returns all fungible token and DeFi positions.
Query params:
filter[positions]: only_simple (tokens only), only_defi (protocol positions), no_filter (all)filter[chain_ids]: Comma-separated chain IDs (e.g., base,ethereum,arbitrum)filter[trash]: only_non_trash (exclude spam), only_trash, no_filtersort: value or -valueUnderstanding LP Positions: Liquidity pools return multiple positions (one per token) with shared group_id. Group by group_id to display LP holdings together.
Response includes:
wallet, deposited, borrowed, staked, lockedgroup_id for LP position groupingReturns interpreted transaction history.
Query params:
filter[chain_ids]: Filter by chainsfilter[asset_types]: fungible, nftfilter[trash]: only_non_trash, no_filterpage[size]: Results per page (default 20)page[after]: Cursor for paginationEach transaction includes:
operation_type: trade, send, receive, approve, stake, unstake, borrow, repay, bridge, mint, burn, bid, executetransfers array with direction, token info, quantities, USD valuesfee with gas cost in native token and USDapplication_metadata with contract address and method infodapp and chain relationshipsReturns Profit and Loss using FIFO method.
Query params:
currency: usd (default)filter[chain_ids]: Comma-separated chain IDsResponse:
{
"data": {
"attributes": {
"total_gain": -15076.15,
"realized_gain": 45328.28,
"unrealized_gain": -60404.44,
"relative_total_gain_percentage": -5.65,
"relative_realized_gain_percentage": 28.08,
"relative_unrealized_gain_percentage": -57.36,
"total_fee": 681.81,
"total_invested": 266672.34,
"realized_cost_basis": 161370.01,
"net_invested": 105302.33,
"received_external": 128217.01,
"sent_external": 67415.77,
"sent_for_nfts": 4333.36,
"received_for_nfts": 423.01
}
}
}
Returns portfolio balance chart over time.
Query params:
currency: usdfilter[chain_ids]: Filter by chainsperiod: Time period for chartReturns NFT portfolio overview with total estimated value.
Returns list of NFT positions held by wallet.
Query params:
filter[chain_ids]: Filter by chainssort: Sort orderReturns NFT collections held by wallet with floor prices.
Returns paginated list of fungible assets. Supports search.
Query params:
filter[search_query]: Search by name or symbolfilter[implementation_chain_id]: Filter by chainfilter[implementation_address]: Filter by contract addresssort: Sort orderReturns single fungible asset by ID.
Returns fungible by chain:address pair (e.g., ethereum:0xa5a4...).
Returns price chart for fungible asset.
Query params:
filter[period]: hour, day, week, month, year, maxReturns list of NFTs with metadata.
Query params:
Returns single NFT by ID with full metadata, traits, and collection info.
Returns list of DApps (protocols) indexed by Zerion.
Returns single DApp with metadata, supported chains, and categories.
Returns all 41+ supported chains with metadata.
Returns single chain by ID.
Returns real-time gas prices across all supported chains.
Useful for:
Returns swap/bridge quotes from multiple providers (aggregator).
Query params:
Returns quotes from 0x, 1inch, Uniswap, and more. Zerion charges 0.5% on L2/alt-L1 trades (waived with Genesis NFT).
Note: Response time is 5-10 seconds due to multi-provider aggregation.
Returns fungibles available for bridge exchange (cross-chain swaps).
Real-time notifications for wallet activity.
Create subscription for wallet transactions.
{
"data": {
"type": "subscriptions",
"attributes": {
"wallet_addresses": ["0x...", "0x..."],
"chain_ids": ["base", "ethereum"],
"callback_url": "https://your-server/webhook"
}
}
}
List all subscriptions.
Get subscription by ID.
Delete subscription.
Enable a disabled subscription.
Disable subscription (pause notifications).
Add/remove wallets from subscription.
Replace all wallets in subscription.
Update callback URL.
Update monitored chains.
List wallets in subscription.
Count wallets in subscription.
Webhook Payload:
null in webhooks (query transactions endpoint for prices)Limits:
Get a free API key instantly — no credit card required:
zk_...export ZERION_API_KEY="zk_your_api_key"
curl "https://api.zerion.io/v1/wallets/0x.../portfolio" \
-H "Authorization: Basic $(echo -n $ZERION_API_KEY: | base64)"
| Plan | Requests/Second | Requests/Day | Price |
|---|---|---|---|
| Free | 10 | 10,000 | $0 |
| Growth | 50 | 100,000 | $99/mo |
| Scale | 200 | 1,000,000 | $499/mo |
| Enterprise | Custom | Custom | Contact |
x402 has no rate limits — pay per request ($0.01 USDC each).
x402 allows agents to pay per request without API keys. Payment is $0.01 USDC on Base.
// Using x402 HTTP flow
const response = await fetch('https://api.zerion.io/v1/wallets/0x.../portfolio', {
headers: {
'X-402-Payment': signedPaymentHeader // ERC-3009 signature
}
});
With zerion-cli:
zerion-cli wallet portfolio 0x... --x402
Add X-Env: testnet header to get testnet data:
curl "https://api.zerion.io/v1/wallets/0x.../portfolio" \
-H "Authorization: Basic ..." \
-H "X-Env: testnet"
Monitor positions and auto-set stop-losses:
#!/bin/bash
# Research with Zerion
positions=$(zerion-cli wallet positions $WALLET --json)
# Find volatile tokens on Base
risky=$(echo $positions | jq '[.data[] | select(.relationships.chain.data.id == "base") | select(.attributes.value > 500)]')
# Execute with Bankr
for token in $(echo $risky | jq -r '.[].attributes.fungible_info.symbol'); do
bankr "set stop loss on $token at -20%"
done
Watch a whale wallet and mirror trades:
// Webhook handler
app.post('/webhook/zerion', async (req, res) => {
const { type, data } = req.body;
if (type === 'transaction' && data.operation_type === 'trade') {
const { transfers } = data;
const bought = transfers.find(t => t.direction === 'in');
if (bought && bought.value > 1000) {
// Mirror the trade via Bankr
await bankr(`buy $100 of ${bought.fungible_info.symbol}`);
}
}
});
Get quotes from Zerion, execute via Bankr:
// Get swap quote from Zerion
const quote = await zerion.get('/v1/swap/offers', {
params: { from: 'USDC', to: 'ETH', amount: '1000' }
});
const bestRate = quote.data[0];
console.log(`Best rate: ${bestRate.rate} from ${bestRate.provider}`);
// Execute via Bankr
await bankr(`swap $1000 USDC to ETH on base`);
All 41+ chains including:
| Chain | Chain ID |
|---|---|
| Ethereum | ethereum |
| Base | base |
| Arbitrum | arbitrum |
| Optimism | optimism |
| Polygon | polygon |
| Solana | solana |
| zkSync Era | zksync-era |
| Linea | linea |
| Scroll | scroll |
| Blast | blast |
| Zora | zora |
| Degen | degen |
| Berachain | berachain |
| Monad | monad |
| Abstract | abstract |
| ... | +26 more |
Connect Claude, Cursor, or any MCP client:
{
"mcpServers": {
"zerion": {
"command": "npx",
"args": ["zerion-mcp-server"],
"env": {
"ZERION_API_KEY": "zk_..."
}
}
}
}
| Code | Description |
|---|---|
| 200 | Success |
| 202 | Accepted - data being prepared, retry shortly |
| 400 | Bad Request - check query params |
| 401 | Unauthorized - invalid API key |
| 402 | Payment Required - x402 payment needed |
| 404 | Not Found - invalid address or resource |
| 429 | Rate Limited - back off with exponential backoff |
| 500 | Server Error - retry with backoff |
Note: 202 responses mean data is being indexed. Retry every few seconds until 200. Stop after 2 minutes if still 202.