# Crypto Wallet Profiler: Age, Funder, Counterparties (`lx112/wallet-profiler`) Actor

Profile any wallet on Base, Ethereum, Arbitrum, Optimism, Polygon or Solana: first activity and age, who funded it, top counterparties, recent and large transfers in USD, balance and account type (wallet, contract, EIP-7702 delegated). Solana: SOL and token holdings in USD and activity.

- **URL**: https://apify.com/lx112/wallet-profiler.md
- **Developed by:** [Jingpeng Xing](https://apify.com/lx112) (community)
- **Categories:** Developer tools, Automation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 wallet profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Crypto Wallet Profiler: Age, First Funder, Counterparties and Holdings

Give it a list of wallet addresses and get back **one profile per wallet**: how old it is, who
funded it, who it deals with most, its recent and large transfers in USD, and its balance. Works
on **Base, Ethereum, Arbitrum, Optimism and Polygon**, plus **Solana** (holdings valued in USD and
recent activity).

- **Know who you're dealing with.** First activity and age in days, the address that first funded
  the wallet, and whether it's a plain wallet, a contract (token, NFT, proxy) or a wallet with an
  EIP-7702 delegation.
- **Who it trades with.** The ten addresses it transferred with most often, with a sent/received
  split and the last time they interacted.
- **Big moves.** Transfers of $1,000 or more in the native coin, the wrapped native coin, USDC or
  USDT, largest first, plus the 20 newest transfers of any kind (native, ERC-20, NFTs).
- **Solana portfolios.** SOL and every SPL / Token-2022 balance valued with Jupiter prices, dust
  and unpriced spam summed separately, and how active the address has been.
- **No API keys to manage.** One item per address, the same data as the
  [agent-data-api](https://onchaincheck.dev/) wallet routes.

### Who uses this

- **Compliance and risk teams:** a quick first look at a counterparty before paying or onboarding
  it: how old, who funded it, who it deals with.
- **Crypto researchers and analysts:** profile airdrop farmers, whales or a project's team wallets
  in bulk.
- **Sales and BD in web3:** see what a prospect's treasury holds and how active it is.
- **AI agents:** a structured wallet summary to reason over, without running an indexer.

### Input

| Field | Example | Notes |
|---|---|---|
| Chain | `eth` | `base`, `eth`, `arbitrum`, `optimism`, `polygon` or `solana`; one chain per run |
| Wallet addresses | `0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045` | 0x addresses on EVM chains, base58 on Solana. ENS names aren't resolved |
| Include recent and large transfers | `true` | EVM only. Off gives smaller items with age, funder, counterparties and counts |

### Output (one dataset item per wallet)

EVM chains (Ethereum example, transfer lists shortened):

```json
{
  "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "chain": "eth",
  "account": {
    "isContract": false,
    "kind": "wallet (EOA) with EIP-7702 delegation",
    "delegatesTo": "0x5A7FC11397E9a8AD41BF10bf13F22B0a63f96f6d",
    "nonce": 5969,
    "nativeBalance": "5.773252986299759339",
    "nativeBalanceUsd": 13856.349
  },
  "age": {
    "firstActivityAt": "2015-09-28T08:24:43.000Z",
    "firstActivityBlock": 302086,
    "firstActivityTx": "0x9b629147b75dc0b275d478fa34d97c5d4a26926457540b15a5ce871df36c23fd",
    "firstDirection": "in",
    "ageDays": 4042.9
  },
  "firstFunder": {
    "address": "0x1Db3439a222C519ab44bb1144fC28167b4Fa6EE6",
    "at": "2015-09-28T08:24:43.000Z",
    "tx": "0x9b629147b75dc0b275d478fa34d97c5d4a26926457540b15a5ce871df36c23fd",
    "asset": "ETH",
    "amount": 0.25
  },
  "activity": {
    "transfersScanned": 200,
    "inboundScanned": 100,
    "outboundScanned": 100,
    "newestAt": "2026-10-22T22:08:47.000Z",
    "oldestScannedAt": "2026-07-16T09:03:47.000Z",
    "moreHistory": true,
    "byCategory": { "erc1155": 2, "erc20": 167, "erc721": 7, "internal": 3, "external": 21 }
  },
  "recentTransfers": [
    {
      "at": "2026-10-22T07:14:47.000Z",
      "block": 26246595,
      "hash": "0x4046bbc92e51e8b11c3dff049ddfba1dbae41153b2b57d44c8578b5b6c5ba12e",
      "direction": "in",
      "counterparty": "0x81f9C853d7CC894F7EF742F62a265a5e9aeeB727",
      "category": "erc721",
      "asset": null,
      "token": "0x53EDeacdA5167731d830F6e9FC17d365F5070060",
      "amount": null,
      "tokenId": "1617",
      "usd": null
    }
  ],
  "topCounterparties": [{ "address": "0x…", "transfers": 12, "sent": 3, "received": 9, "lastAt": "2026-10-21T…" }],
  "largeTransfers": [{ "at": "…", "direction": "out", "asset": "USDC", "amount": 25000, "usd": 25000, "…": "…" }],
  "nativeUsd": { "symbol": "ETH", "price": 2400.1, "source": "Chainlink ETH/USD", "updatedAt": "…" },
  "notes": "From Alchemy's transfer index: …"
}
```

Solana (shortened):

```json
{
  "address": "CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM",
  "chain": "solana",
  "kind": "program-derived address",
  "totalUsd": 482370.1,
  "sol": { "balance": 2838.25651948, "priceUsd": 104.297, "usdValue": 296021.08 },
  "tokens": [
    { "mint": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn", "symbol": "PUMP", "name": "Pump", "program": "token-2022", "amount": 24586557.6555, "priceUsd": 0.00464165, "usdValue": 114122 }
  ],
  "otherTokens": { "count": 131, "totalUsd": 3593.69 },
  "dust": { "count": 108, "totalUsd": 44.39, "thresholdUsd": 1 },
  "unpriced": { "count": 994, "largest": ["…"] },
  "tokenAccounts": { "total": 1240, "withBalance": 1238, "empty": 2 },
  "activity": { "newestAt": "…", "signaturesScanned": 1000, "transactions24h": 1000, "historyGoesFurtherBack": true, "…": "…" }
}
```

Addresses that aren't valid for the chain, or whose lookup fails, get an item with an `error`
field and aren't charged.

### What it covers, and what it doesn't

- **EVM:** activity, counterparties and large transfers cover the newest 100 transfers in each
  direction (`moreHistory: true` means there are older ones). Internal (contract-made) native
  transfers are included on Ethereum and Polygon only. Large transfers are priced at today's price,
  in the native coin, wrapped native coin, USDC and USDT.
- **Solana:** tokens worth at least $1 are listed (up to 25); smaller balances are summed as dust.
  Activity comes from the newest 1,000 transaction signatures.
- It reports facts, not labels: it doesn't say whether a wallet is an exchange, a scammer or
  sanctioned.

### Pricing

Pay per event: charged per **wallet profile** returned. Invalid addresses and failed lookups cost
nothing.

### Notes

Data comes from public blockchain records through Alchemy's APIs, Chainlink price feeds and
Jupiter. This actor isn't affiliated with any of them.

# Actor input Schema

## `chain` (type: `string`):

Blockchain the wallets are on. All addresses in one run are profiled on this chain.

## `addresses` (type: `array`):

Wallet addresses on the selected chain, one profile each: 0x addresses on the EVM chains (ENS and Basenames aren't resolved), base58 addresses on Solana. Duplicates are profiled once.

## `includeTransfers` (type: `boolean`):

EVM chains: include the 20 newest transfers and up to 10 transfers of $1,000 or more in each profile. Turn off for smaller items with just age, funder, counterparties and activity counts. Solana profiles have no transfer lists, so this has no effect there. The price is the same either way.

## Actor input object example

```json
{
  "chain": "eth",
  "addresses": [
    "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
  ],
  "includeTransfers": true
}
```

# Actor output Schema

## `results` (type: `string`):

One profile per address. EVM: account type and balance, age and first activity, first funder, activity counts, top counterparties, recent and large transfers. Solana: SOL and token holdings in USD, dust, and recent activity. Failed addresses have an error field and aren't charged.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "addresses": [
        "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lx112/wallet-profiler").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "addresses": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"] }

# Run the Actor and wait for it to finish
run = client.actor("lx112/wallet-profiler").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "addresses": [
    "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
  ]
}' |
apify call lx112/wallet-profiler --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lx112/wallet-profiler"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/M1Ztg3j2j7UYTH3wX/builds/f6QFTzI8OF3NsgrIa/openapi.json
