EVM Wallet Scraper — Balances, Tokens, Transactions, Risk Flags
Pricing
from $5.00 / 1,000 address analyzeds
EVM Wallet Scraper — Balances, Tokens, Transactions, Risk Flags
Wallet & contract intelligence for Ethereum, Base, Arbitrum, Optimism, Polygon, Gnosis, ZKsync, Scroll and more: balances, ERC-20 holdings with USD value (spam filtered), recent transactions with counterparties, token transfers, internal txs, NFTs, balance history, risk flags. ENS names accepted.
Pricing
from $5.00 / 1,000 address analyzeds
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Wallet Intel — EVM wallet & contract scraper (16 chains, no API key)
Give it wallet or contract addresses (or ENS names) and get one clean JSON per address: native balance and USD value, ERC-20 holdings with prices (spam filtered), activity counters, recent transactions with direction and labelled counterparties, token transfers, internal transactions, NFTs, 90-day balance history and a deterministic list of risk flags. Works on Ethereum, Base, Arbitrum, OP Mainnet, Polygon, Gnosis, ZKsync, Scroll, Celo, Unichain, Soneium, Mode, Ink, World Chain and two testnets via the public Blockscout API. No API key, no proxy, no browser.
Built for AI agents and back-office automations that must answer "who is this address and what does it do?" in one call.
Use cases
- Counterparty due diligence — before paying or accepting an invoice in crypto: balance, age, activity, explorer scam flag, exchange labels, proxy/EIP-7702 delegation.
- KYT-lite monitoring — schedule a daily run on your treasury or customer wallets with
sinceDate= yesterday to get only new transactions and token transfers. - Payment reconciliation —
includeTokenTransfers+tokenFilter= USDC contract: "did wallet X receive ≥ 500 USDC since Monday?" - Portfolio snapshot —
totalPortfolioUsd, top tokens by value, spam removed; run across your 200 wallets on Base in one batch. - Lead scoring / airdrop eligibility — flag whales, fresh wallets, dormant wallets, NFT collections held.
- Contract intel — verified? proxy type, implementations, creator and creation tx, who calls it most (top counterparties).
Input
| Field | Type | Default | Notes |
|---|---|---|---|
addresses | string[] | — (required) | 0x addresses or ENS names (vitalik.eth). Duplicates removed. Invalid values yield a found:false item. |
chain | enum | base | See Reference → Chains. Aliases: eth, mainnet, arb, op, matic, xdai. |
recentTxLimit | int 0–200 | 10 | Recent native transactions per address (pages of 50). |
txDirection | all / from / to | all | from = signed by the address (outgoing), to = incoming. |
sinceDate | date | — | Keep only txs / token transfers / internal txs on or after this date (UTC). Paging stops early → cheaper runs. |
untilDate | date | — | Upper bound (UTC). |
includeTokens | bool | true | ERC-20 balances with USD value, sorted by value. Auto-skipped for large contracts (tokensSkipped:true). |
tokensLimit | int 1–500 | 50 | Max tokens kept per address. |
minTokenUsd | number | 0 | Drop positions worth less than this. |
hideSpamTokens | bool | true | Drop explorer-flagged scams and unpriced airdrop-lure tokens (URLs, "claim", "visit"…). Count in spamTokenCount. |
includeTokenTransfers | bool | false | Recent ERC-20/721/1155 transfers with direction, counterparty, USD value, likelySpam. |
tokenTransfersLimit | int 0–200 | 25 | |
tokenTransferType | all / ERC-20 / ERC-721 / ERC-1155 | all | |
tokenFilter | string[] | [] | Only transfers of these token contracts. |
includeInternalTransactions | bool | false | Value-carrying internal calls (DEX payouts, bridge deliveries). |
internalTxLimit | int 0–200 | 25 | |
includeNfts | bool | false | NFT collections held (first 50) with counts and sample image. |
includeBalanceHistory | bool | false | Daily native balance, last ~90 days (only days with changes). |
counterpartiesLimit | int 0–50 | 10 | Size of topCounterparties (ranked by interactions within the fetched transactions). |
fields | string[] | [] | Keep only these top-level fields (address, chain, found, error, fetchedAt always kept). |
requestDelayMs | int 0–5000 | 150 | Politeness delay before each explorer request. |
All original inputs (addresses, chain, recentTxLimit, includeTokens) keep their meaning.
Reference
Chains
chain | Network | Chain ID | Native | Explorer |
|---|---|---|---|---|
ethereum | Ethereum mainnet | 1 | ETH | eth.blockscout.com |
base | Base | 8453 | ETH | base.blockscout.com |
arbitrum | Arbitrum One | 42161 | ETH | arbitrum.blockscout.com |
optimism | OP Mainnet | 10 | ETH | explorer.optimism.io |
polygon | Polygon PoS | 137 | POL | polygon.blockscout.com |
gnosis | Gnosis Chain | 100 | xDAI | gnosis.blockscout.com |
zksync | ZKsync Era | 324 | ETH | zksync.blockscout.com |
scroll | Scroll | 534352 | ETH | scroll.blockscout.com |
celo | Celo | 42220 | CELO | celo.blockscout.com |
unichain | Unichain | 130 | ETH | unichain.blockscout.com |
soneium | Soneium | 1868 | ETH | soneium.blockscout.com |
mode | Mode | 34443 | ETH | explorer.mode.network |
ink | Ink | 57073 | ETH | explorer.inkonchain.com |
worldchain | World Chain | 480 | ETH | worldchain-mainnet.explorer.alchemy.com |
sepolia | Ethereum Sepolia (testnet) | 11155111 | ETH | eth-sepolia.blockscout.com |
base-sepolia | Base Sepolia (testnet) | 84532 | ETH | base-sepolia.blockscout.com |
Other Blockscout instances (e.g. Zora, Linea, Mantle) did not answer the public v2 API at the time of writing and are therefore not offered.
Flags (flags[])
| Flag | Meaning |
|---|---|
not_found_on_chain | Address unknown to the explorer on this chain. |
flagged_scam_by_explorer | Blockscout is_scam / non-ok reputation. |
unverified_contract | Contract without verified source code. |
proxy_contract | Upgradeable proxy (see proxyType, implementations). |
eoa_with_delegated_code_eip7702 | Wallet that delegated code via EIP-7702 (smart-account features). |
no_outgoing_transactions / fresh_wallet_under_5_txs | Very young wallet. |
inactive_over_180d / dormant_over_1y | No recent activity (wallets only). |
near_zero_balance / whale_over_1m_usd | Portfolio size (native + tokens, USD). |
high_failed_tx_share | ≥ 30 % of fetched transactions failed (wallets only). |
labeled_exchange | Explorer tag names a CEX. |
labeled_high_risk | Tag mentions sanctions/OFAC/hack/exploit/phishing/drainer. |
Flags are a triage checklist, not a verdict.
Frequently used token contracts
| Token | Base | Ethereum |
|---|---|---|
| USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
| USDT | — | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
| WETH | 0x4200000000000000000000000000000000000006 | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
Examples
1. Vet a counterparty before paying (Base)
{ "addresses": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"], "chain": "base", "recentTxLimit": 25, "includeTokens": true, "counterpartiesLimit": 10 }
2. Daily monitor: what happened since yesterday on our treasury wallets (Ethereum)
{ "addresses": ["treasury.mycompany.eth", "0x…"], "chain": "ethereum", "recentTxLimit": 200, "sinceDate": "2026-09-12", "includeTokenTransfers": true, "tokenTransfersLimit": 200, "includeInternalTransactions": true, "includeTokens": false }
3. Did the customer pay in USDC? (Base)
{ "addresses": ["0xCustomerWallet…"], "chain": "base", "recentTxLimit": 0, "includeTokens": false, "includeTokenTransfers": true, "tokenTransferType": "ERC-20", "tokenFilter": ["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"], "sinceDate": "2026-09-08" }
4. Portfolio snapshot for 100 wallets, only positions ≥ $50, compact output
{ "addresses": ["0x…", "0x…"], "chain": "arbitrum", "recentTxLimit": 0, "tokensLimit": 100, "minTokenUsd": 50, "fields": ["nativeBalance", "nativeUsd", "totalTokenUsd", "totalPortfolioUsd", "tokens", "flags"] }
5. Contract intel: who calls this contract and is it upgradeable?
{ "addresses": ["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"], "chain": "base", "recentTxLimit": 100, "txDirection": "to", "includeTokens": false, "counterpartiesLimit": 25 }
Output
One item per input address (trimmed real example, Base):
{"query": "vitalik.eth","address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","chain": "base", "chainId": 8453, "nativeSymbol": "ETH","explorerUrl": "https://base.blockscout.com/address/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","found": true,"isContract": true, "isVerifiedContract": true, "proxyType": "eip7702","implementations": [{ "address": "0x5A7FC11397E9a8AD41BF10bf13F22B0a63f96f6d", "name": "AmbireAccount7702" }],"ensName": "vitalik.eth", "tags": [], "isScam": false, "reputation": "ok","nativeBalance": 3.1287, "nativeUsd": 7896.08, "nativePriceUsd": 2523.71,"txCount": 51, "txCountIsLowerBound": true, "tokenTransferCount": 51, "internalTxCount": 51,"tokenCount": 2575, "tokenCountShown": 50, "spamTokenCount": 89, "tokensSkipped": false, "tokenListPartial": false,"totalTokenUsd": 19145.92, "totalPortfolioUsd": 27042.0,"tokens": [{ "symbol": "TRUE", "name": "True", "contract": "0x21CF…", "decimals": 18, "balance": 1066680, "priceUsd": 0.0139, "usdValue": 14802.9, "holdersCount": 24836, "reputation": "ok" }],"lastSeen": "2026-08-10T13:00:47.000000Z","recentWindow": { "txs": 10, "direction": "all", "sentNative": 0.0, "receivedNative": 0.0, "feesNative": 0.00002, "failedTxs": 0, "uniqueCounterparties": 1 },"recentTransactions": [{ "hash": "0x1234…", "timestamp": "2026-08-10T13:00:47.000000Z", "direction": "out", "counterparty": "0x…", "counterpartyLabel": "PublicResolver", "valueNative": 0, "method": "setContenthash", "status": "ok", "feeNative": 0.0000277 }],"tokenTransfers": [], "internalTransactions": [], "nftCollections": [], "balanceHistory": [],"topCounterparties": [{ "address": "0x…", "label": "Deterministic Deployer", "txCount": 13, "sentNative": 0, "receivedNative": 0, "lastSeen": "2026-07-19T20:43:47.000000Z" }],"flags": ["eoa_with_delegated_code_eip7702"],"warnings": [],"source": "blockscout", "sourceUrl": "https://base.blockscout.com/api/v2/addresses/0xd8dA…", "fetchedAt": "2026-09-12T23:32:44.398Z"}
| Field | Description |
|---|---|
query, address, ensName | Input value, resolved checksum address, ENS primary name if any. |
found, error | false + reason when the address is unknown/invalid (no per-item charge). |
isContract, isVerifiedContract, contractName, proxyType, implementations, creator, creationTxHash | Contract facts. proxyType: "eip7702" = wallet with delegated code. |
tags, isScam, reputation | Explorer labels (public tags, Kleros/OLI metadata) and scam status. |
nativeBalance, nativeUsd, nativePriceUsd | Native coin balance and USD value. |
txCount, txCountIsLowerBound | Transactions signed by the address. Blockscout computes counters lazily; when it returns 0 for an active address the actor reports 51 with txCountIsLowerBound:true ("50+"). |
tokenTransferCount, internalTxCount, gasUsed | Activity counters. |
tokens[], tokenCount, tokenCountShown, spamTokenCount, totalTokenUsd, totalPortfolioUsd | ERC-20 holdings. tokenListPartial:true when the full list timed out and the top-N-by-value fallback was used. |
firstSeen, lastSeen | From fetched transactions (firstSeen only when the whole history fits). |
recentWindow | Summary of fetched transactions: counts, native sent/received, fees, failures, unique counterparties. |
recentTransactions[] | direction in/out/self, counterparty + counterpartyLabel, value, method, status, fee, createdContract. |
tokenTransfers[] | Token, amount, USD value, direction, counterparty, likelySpam. |
internalTransactions[], nftCollections[], balanceHistory[] | Optional extras. |
topCounterparties[] | Most frequent counterparties with labels and flows. |
flags[] | See Reference. |
warnings[] | Sub-requests that failed/timed out for this address (item is still delivered). |
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~wallet-intel/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"addresses":["vitalik.eth"],"chain":"base","recentTxLimit":25}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/wallet-intel').call({ addresses: ['vitalik.eth'], chain: 'base' });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(token)run = client.actor("yadroo/wallet-intel").call(run_input={"addresses": ["vitalik.eth"], "chain": "base"})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: add https://mcp.apify.com to Claude / Cursor / any MCP client and call the yadroo/wallet-intel tool with the same JSON input.
Pricing
Pay per event: $0.001 per run start + $0.005 per analyzed address. Every dataset item counts, including found:false rows for invalid inputs. A typical due-diligence run on 10 addresses costs $0.051; a daily monitor over 100 wallets costs $0.501 per day. Batch addresses to amortize the start fee.
Limits & FAQ
- Rate limits — Blockscout public APIs are generous but shared; the actor sleeps
requestDelayMsbetween calls and retries 429/5xx with exponential backoff. Raise the delay if you see 429 warnings. - Freshness — live explorer data (seconds behind the chain). Prices are the explorer's (CoinGecko-backed), refreshed every few minutes.
- Huge wallets/contracts — full token lists of whales can time out; the actor falls back to a paginated, value-sorted list (
tokenListPartial:true). Token balances are skipped for non-EOA contracts (tokensSkipped:true) because router/pool balance lists are enormous. - Counters — Blockscout computes some counters lazily; see
txCountIsLowerBound. - Errors — network/explorer failures on sub-requests never drop an address: the item is delivered with
warnings[]. Invalid chains or dates fail the run immediately with a clear message. - Roadmap — ERC-20 approval/allowance audit, per-token PnL, more Blockscout chains as they expose the v2 API.
Made by Yadroo. Siblings: base-token-intel · ens-resolver · dexscreener-tokens · bitcoin-mempool · sanctions-screen · domain-intel