Skip to main content

Documentation Index

Fetch the complete documentation index at: https://helius-auto-translations.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Beta: The Wallet API is currently in beta. APIs and response formats may change.

Overview

The Wallet Identity endpoint identifies known wallet addresses on Solana, including centralized exchanges, DeFi protocols, institutions, and other recognized entities. This is useful for compliance, analytics, and displaying human-readable names for known addresses. Both the single and batch endpoints accept SNS .sol domains and ANS custom TLDs (e.g. .bonk, .poor, .abc) in addition to raw Solana addresses. Domain resolution is mainnet-only.

API Reference

View detailed API documentation for wallet identity lookup
This endpoint uses the same identity system that powers Orb, our Solana block explorer. Our database includes 12,500+ labels (human-readable primary names, including 2,250+ programs) and 10.7M+ tags (categorical properties like “Binance deposit address” or “Seeker Phone”), and is continuously growing.

When to Use This

Use the Wallet Identity API when you need to:
  • Identify Exchange Wallets: Determine if a wallet belongs to Binance, Coinbase, Kraken, etc.
  • Track Protocol Activity: Identify DeFi protocol wallets and treasury addresses
  • Compliance & AML: Flag transactions involving known entities
  • Analytics: Categorize wallet types in your data pipeline
  • User Experience: Display “Sent to Binance 1” instead of a raw address
  • Batch Processing: Look up hundreds of addresses efficiently

Quickstart

Single Wallet Lookup

Look up identity information for a single wallet address:
const getWalletIdentity = async (address) => {
  const url = `https://api.helius.xyz/v1/wallet/${address}/identity?api-key=YOUR_API_KEY`;

  const response = await fetch(url);
  if (!response.ok) {
    if (response.status === 404) {
      console.log("No identity found for this address");
      return null;
    }
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  const identity = await response.json();
  console.log(`Found: ${identity.name} (${identity.category})`);
  return identity;
};

// Example: Binance wallet
getWalletIdentity("HXsKP7wrBWaQ8T2Vtjry3Nj3oUgwYcqq9vrHDM12G664");

Look Up by Domain Name

You can also pass an SNS .sol domain or an ANS custom TLD directly — the endpoint resolves the domain and returns the identity of the owner address:
// Works identically — the endpoint resolves the domain first.
const identity = await getWalletIdentity("toly.sol");

// ANS custom TLD
await getWalletIdentity("miester.bonk");
The single-endpoint response is the standard identity object for the resolved address — there is no inputDomain marker. If you need to correlate inputs with outputs (for example, when looking up many domains at once), use the batch endpoint.
Domain resolution is mainnet-only. On devnet/testnet, a domain input to this endpoint returns 400. Positive resolutions are cached for up to 2 hours, so a recently-transferred domain may briefly resolve to the prior owner’s identity.

Batch Lookup (Up to 100 Entries)

Look up multiple entries in a single request for better performance. Each entry can be either an address or a domain name:
const batchIdentityLookup = async (addresses) => {
  const url = "https://api.helius.xyz/v1/wallet/batch-identity?api-key=YOUR_API_KEY";

  const response = await fetch(url, {
    method: "POST",
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ addresses })
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  const identities = await response.json();
  return identities;
};

// Example: Mix addresses and domains in a single request
const addresses = [
  "HXsKP7wrBWaQ8T2Vtjry3Nj3oUgwYcqq9vrHDM12G664", // Binance (address)
  "toly.sol",                                      // SNS domain
  "miester.bonk"                                   // ANS custom TLD
];

batchIdentityLookup(addresses).then(identities => {
  identities.forEach(identity => {
    if (identity.unresolved) {
      console.log(`${identity.inputDomain}: could not be resolved`);
      return;
    }
    const label = identity.inputDomain
      ? `${identity.inputDomain}${identity.address}`
      : identity.address;
    console.log(`${label}: ${identity.name}`);
  });
});

Response Format

Successful Response

{
  "address": "HXsKP7wrBWaQ8T2Vtjry3Nj3oUgwYcqq9vrHDM12G664",
  "type": "exchange",
  "name": "Binance 1",
  "category": "Centralized Exchange",
  "tags": ["Centralized Exchange"]
}

Batch: Resolved Domain Entry

In a batch response, any entry whose input was a domain name carries an additional inputDomain field so you can correlate the response back to the original request:
{
  "address": "7v91N7iZ9mNicL8WfG6cgSCKyRXydQjLh6UYBWwm6y1Q",
  "type": "wallet",
  "name": "toly",
  "category": "Key Opinion Leader",
  "tags": ["Key Opinion Leader"],
  "inputDomain": "toly.sol"
}

Batch: Unresolved Domain Entry

When a domain in a batch request cannot be resolved, the batch does not fail — the entry is returned in place with address: null, type: "unknown", and unresolved: true. Request order is preserved.
{
  "address": null,
  "type": "unknown",
  "inputDomain": "nonexistent-xyz.sol",
  "unresolved": true
}

404 Response (Unknown Wallet or Unresolvable Domain)

On the single endpoint, a 404 is returned if the wallet has no identity entry or if a domain input could not be resolved:
{
  "error": "No identity information available for this address",
  "code": 404
}
{
  "error": "Domain 'nonexistent-xyz.sol' could not be resolved",
  "code": 404
}

Identity Categories

Wallets can be classified into the following categories powered by the Orb identity database:

Account Tag Types

CategoryDescriptionExamples
Centralized ExchangeCEX wallets and hot walletsBinance 1, Coinbase 1, Kraken, OKX Exchange 1, Bybit Hot Wallet
Cross-chain BridgeBridge protocol addressesWormhole Bridge, AllBridge, Portal Bridge, deBridge
DeFiDeFi protocol addressesJupiter, Raydium, Orca, Marinade Finance, Kamino
Key Opinion LeaderNotable individuals and influencersAnatoly Yakovenko, Raj Gokal
Market MakerMarket making firmsJump Trading, Wintermute, GSR Markets
Trading FirmProprietary trading firmsAlameda Research, DRW Trading
ValidatorValidator and stake pool addressesCoinbase Validator, Jito Validator, Figment Validator
TreasuryProject and protocol treasuriesMarinade Treasury, Helium Treasury, Solana Foundation Treasury
DAODecentralized autonomous organizationsMango DAO, Grape DAO, MonkeDAO Treasury
NFTNFT marketplaces and projectsMagic Eden, Tensor, OpenSea Solana, DeGods Treasury
Stake PoolLiquid staking pool addressesMarinade Stake Pool, Jito Stake Pool, BlazeStake
MultisigMulti-signature walletsSquads Multisig, Solana Foundation Multisig
OraclePrice feed and oracle providersPyth Network, Switchboard Oracle, Chainlink Solana
GameGaming and GameFi projectsStar Atlas, Aurory, Genopets Treasury
PaymentsPayment processorsSolana Pay, Sphere, Helio Pay
ToolsDeveloper tools and utilitiesPhantom Wallet, Backpack, Solflare Wallet
AirdropAirdrop distribution addressesJupiter Airdrop, Pyth Airdrop Distributor
GovernanceGovernance program addressesRealms Governance, SPL Governance
AuthorityProgram authorities and adminsToken Program Authority, Metaplex Authority
JitoJito-specific addressesJito Tip 1, Jito Tip 2, Jito MEV Payment
MemecoinMemecoin projectsBonk Treasury, Dogwifhat, Book of Meme
Casino & GamblingGambling and casino dAppsStake.com Hot Wallet, Rollbit, DexSport
DePINDecentralized physical infrastructureHelium Network, Render Network, Hivemapper
Proprietary AMMCustom AMM implementationsPhoenix DEX, GooseFX
RestakingRestaking protocolsSolayer, Fragmetric
VaultVault and custody addressesSolend Vault, Tulip Vault, Francium Vault
FeesFee collection addressesJupiter Fee Collector, Raydium Fees
FundraiseFundraising and ICO addressesToken Sale Wallet, Fundraise Multisig
Genesis Block DistributionGenesis distribution addressesSolana Genesis Distribution
Non-Circulating SupplyNon-circulating token addressesTeam Vesting Wallet, Foundation Reserve
Transaction SendingTransaction sending servicesJito Tip 1, Jito Tip 2, Helius Sender Tip 1
SystemSolana system programsSystem Program, Config Program
X402X402 protocol addressesX402 Protocol
OtherUncategorized known addressesVarious known wallets

Malicious Categories

CategoryDescriptionExamples
Exploiter, Hackers & ScamsKnown exploit and hack addressesWormhole Exploiter Wallet, SagaDAO Hacker Wallet, Mango Exploiter
HackerConfirmed hacker addressesSolana Hack 2022, DeFi Protocol Hacker
RuggerRug pull perpetratorsSquid Game Token Rugger, Known Rug Pull Wallet
ScammerConfirmed scam addressesFake Airdrop Scammer, Phishing Scam Wallet
SpamSpam token creatorsSpam Token Creator, Airdrop Spammer

Program Categories

Programs (smart contracts) are classified separately:
CategoryDescriptionExamples
SwapToken swap protocolsJupiter, Raydium, Orca
DeFiGeneral DeFi protocolsDrift, Mango
Borrow LendLending protocolsSolend, MarginFi
NFTNFT marketplacesMagic Eden, Tensor
StakingStaking programsMarinade, Jito
BridgeCross-chain bridgesWormhole, AllBridge
AggregatorDEX aggregatorsJupiter Aggregator
PerpetualsPerpetual futuresDrift, Mango
OracleOracle providersPyth, Switchboard
LaunchpadToken launchpadsRaydium Launchpad
GovernanceGovernance programsSPL Governance
Game or CasinoGaming programsStar Atlas
Prediction MarketPrediction marketsDrift Predictions
PaymentsPayment protocolsSolana Pay
PrivacyPrivacy protocolsElusiv
CompressionState compressionBubblegum
InfrastructureCore infrastructureMetaplex
ToolsDeveloper toolsClockwork
RWAReal-world assetsOndo Finance
DePINDecentralized infrastructureHelium, Render
DeSciDecentralized scienceVitaDAO
AirdropAirdrop programsMerkle distributors
Web3Web3 applicationsVarious
NativeSolana native programsSystem Program
Proprietary AMMCustom AMM designsPhoenix
Trading SniperTrading botsMEV bots
Arbitrage or Sandwich BotMEV and arb botsJito bundles
SpamSpam programsSpam tokens
OtherUncategorized programsVarious

Use Cases

Flag Exchange Deposits

Identify when funds are sent to a centralized exchange:
const checkIfExchange = async (address) => {
  try {
    const identity = await getWalletIdentity(address);
    if (identity && identity.category === "Centralized Exchange") {
      console.log(`Funds sent to ${identity.name}`);
      return true;
    }
  } catch (error) {
    // Not a known exchange
  }
  return false;
};

Display Human-Readable Names

Show friendly names in your UI instead of addresses:
const getDisplayName = async (address) => {
  try {
    const identity = await getWalletIdentity(address);
    return identity ? identity.name : shortenAddress(address);
  } catch (error) {
    return shortenAddress(address);
  }
};

// Usage in UI
const displayName = await getDisplayName("HXsKP7wrBWaQ8T2Vtjry3Nj3oUgwYcqq9vrHDM12G664");
// Returns: "Binance 1" instead of "HXsKP...G664"

Batch Process Transaction Counterparties

Efficiently identify all counterparties in a list of transactions:
const identifyTransactionCounterparties = async (transactions) => {
  // Extract all unique addresses
  const addresses = [...new Set(
    transactions.map(tx => tx.counterparty)
  )];

  // Batch lookup (up to 100 at a time)
  const allIdentities = [];
  for (let i = 0; i < addresses.length; i += 100) {
    const chunk = addresses.slice(i, i + 100);
    const identities = await batchIdentityLookup(chunk);
    allIdentities.push(...identities);
  }

  // Create a map for quick lookup
  const identityMap = new Map(
    allIdentities.map(id => [id.address, id])
  );

  // Enrich transactions with identity info
  return transactions.map(tx => ({
    ...tx,
    counterpartyName: identityMap.get(tx.counterparty)?.name || "Unknown"
  }));
};

Best Practices

When looking up more than one address, always use the batch endpoint (POST /v1/wallet/batch-identity). It’s significantly faster and more efficient than making individual requests.
Not all wallets will have identity information. Design your application to handle 404 responses and fall back to displaying the raw address.
Identity data changes infrequently. Cache results locally to reduce API calls and improve performance.
The batch endpoint supports up to 100 addresses per request. For larger datasets, chunk your requests accordingly.

Common Errors

Error CodeDescriptionSolution
400Invalid wallet address or domain format, or domain input on non-mainnetVerify the input is a valid base58 Solana address or a well-formed domain (e.g. toly.sol), and that you’re targeting mainnet
401Missing or invalid API keyCheck your API key is included in the request
404No identity found, or domain could not be resolvedSingle endpoint only — the wallet has no identity entry, or the domain does not exist. In batch requests, unresolvable domains are returned as unresolved: true entries rather than 404
429Rate limit exceededReduce request frequency or upgrade your plan

Need Help?

API Reference

View detailed API specs with request/response schemas

Contact Support

Get help from our team