Is there a way to find/export all addresses with a balance above a certain number in Ether?

Any service/API provider is available for above requirement?

  • Ethereum means ICO tokens also? Or only ether? Commented Feb 13, 2018 at 3:58
  • For the moment Only ether. Commented Feb 13, 2018 at 4:02
  • Updated my ans with explanation. mark is accepted if its resolved your qus. Commented Feb 13, 2018 at 4:24

4 Answers 4


Probably the simplest way to do this is to use Google BigQuery. The following query:

SELECT `address`, `eth_balance`
FROM `bigquery-public-data.crypto_ethereum.balances`
WHERE `eth_balance` >  2000000.0e18
ORDER BY `eth_balance` DESC;

returns me the following result:

address                                    eth_balance
0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 2733310079371312514929342
0x742d35cc6634c0532925a3b844bc454e4438f44e 2290579634641537500000001
0xbe0eb53f46cd790cd13851d5eff43d12404d33e8 2201522847530539022444548
  • what this guy sais is the fastest way to do so. google provides this data for free
    – OWADVL
    Commented Feb 7, 2020 at 16:02

I figured out a way to achieve the above. Although it is very time talking but still useful. We need to crawl over all blocks starting from 0 to the latest block number and from each block get the transactions details and record the addresses.

Following is the script:
   var blockNum = 0;
     Loop---(While/for) run until latest block get fetched
     var block = blockNum++;
     var block = await web3.eth.getBlock(block);
     if (!block)
     console.log('block', block, 'transactions', block.transactions.length);
     for(var i = 0; i < block.transactions.length; i++) {
               var tx = await web3.eth.getTransaction(block.transactions[i]);
               if (parseInt(tx.value) > 0) {
               addresses[tx.to] = true;

     var positiveAddresses = [];
     for (address in addresses) {
          try {
               let balance = await web3.eth.getBalance(address);
               if (balance > 0) {
          } catch (err) {

The above will print all the address having balance greater than zero.

  • That's going to take a very long time... You're checking every transaction ever made (over RPC). Also, it's going to give you an array containing lots of duplicate addresses. In the time it takes to run that command you could become an expert in how the state tries are laid out, and learn how to parse them in a fraction of the time :-) Commented Feb 13, 2018 at 10:01
  • I Know. Even I don't want to iterate over each transaction ever made on block chain. If you know better technique than this then please elaborate. Commented Feb 13, 2018 at 10:52

TrueBlocks (disclosure my project) does exactly this. It scrapes every single piece of data and builds a non-duplicative IPFS-sharable index of every address appearance anywhere on the Ethereum chain. From there one could extract all addresses and from there balances. It takes two days to run against a local fully synced tracing or archive node. It’s really not feasible against Infura because Infura is astonishingly slow compared to a local node.


Yes you can. I am attaching below code for doing the same:

web3.eth.getAccounts(function(error, accounts){
  for(var index=0;index<accounts.length;index++){

function getBalance(var account){
    var balance = web3.eth.getBalance(account); 
    balance = web3.toDecimal(balance);
    if(balance > web3.toWei(1,'ether')){
         console.log("Address"+ account + " and balance is " +web3.toWei(balance,'ether'));

Explanation for above code:

web3.eth.getAccounts is a asyc method, using this method you can get all the accounts in connected ether network based on your Web3.providers.HttpProvider. You can also call web3.eth.accounts, but I'll not recommend.

web3.eth.getBalance(account); method will returns balance. Do check currently I am checking 1 ether, you can replace value as per your requirement.


Web3.providers.HttpProvider is for connecting any eth node that might be local or test or main net.

You can connect to ether main net using HTTPProvider by following 2 ways:

  1. 3rd party providers like infura.io provides services for connecting to Eth mainnet, Ropsten, Rinkeby. Refer below link for more details https://blog.infura.io/getting-started-with-infura-28e41844cc89
  2. Run your node, I know this is cost effective but you will get trusted verified network data.
  • Using web3.eth.getAccounts method, you can only get those accounts which are associated to your Web3.providers.HttpProvider. I want to retrieve all accounts which are created on block-chain by anyone. Similar to this - etherscan.io/accounts Commented Feb 13, 2018 at 4:44
  • @Sandesh updated my ans Commented Feb 13, 2018 at 5:17
  • Through web3.getAccounts method you can only get those accounts which are running on your node. I need to fetch all addresses on network. Commented Feb 13, 2018 at 6:24
  • Iterating over all non-zero-balance addresses via RPC/web3 would take (almost literally) forever - it's just too slow. It would take even longer using Infura because of their rate limiting. You'd need to read the state data directly (by parsing the .ldb database files), and to do that quickly and efficiently you'd need to run a full node. I don't think there's a simple way to do what you're asking. Commented Feb 13, 2018 at 9:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.