BitcoinDatabase.com

Query the chain · Bulk balance checking

Bulk Bitcoin address balance checker to check multiple Bitcoin addresses at once

A bulk Bitcoin address balance checker takes a whole list of addresses and returns the exact balance of every one in a single pass. Upload the list, get a table back.

or try it below ↓

REST API · SQL · dashboards · address history from genesis

Query Console
btc
try:

Hit Run to query the Bitcoin blockchain.

Live from the chain for .

BTC

Balance trail

informational on-chain data · not financial advice

REST API · SQL · dashboards, one indexed dataset. Reading the chain ...

The free multi-address tools on the web all stop at roughly the same place. One popular checker caps you at 20 addresses per request and tells you to submit multiple requests for anything larger; another allows 50 per query and suggests you split your list. That is fine when you are checking a handful of paper wallets. It falls apart the moment you hold a real address set: an exchange proving reserves across 40,000 deposit addresses, a fund reconciling cold storage every morning, a compliance team screening a list handed over by a counterparty. Chunking 40,000 addresses into batches of 20 is 2,000 requests against a public endpoint that will rate-limit you long before you finish, and we can confirm that from the receiving end, because public explorer endpoints commonly answer a modest burst with an IP blacklist rather than data.

This is the same indexed chain the rest of the platform reads from, so a bulk check is a single query, not a loop. Paste addresses one per line, upload a CSV, or pass the list to the API and get back the confirmed balance to the satoshi, total received, total sent, transaction count, first and last activity, and the UTXO count behind each balance. In SQL you go further and put your address list into a query directly, joining it against entity labels, fund flows or the rich list, so a reconciliation that used to be a script plus a spreadsheet becomes one statement. Addresses that have never been seen on chain come back explicitly as zero rather than silently disappearing from the results, which matters when you are reconciling a list and need every row accounted for.

One security point worth stating plainly, because the freebie tools bury it: checking a balance never requires a private key or a seed phrase. A Bitcoin address is public information and its balance is public information. Any tool that asks for a key to show you a balance is trying to take your coins. We only ever accept addresses and extended public keys. This is informational on-chain data, not financial, investment or legal advice.

REST API SQL DASHBOARDS WEBHOOKS CSV EXPORT

History from genesis queryable in seconds

On-chain data not financial advice

Why it works

What you get with Bulk balance checking

A batch that half-fails still returns HTTP 429

Re-probed on 17 September 2026. A semicolon-separated BlockCypher batch of one address returned HTTP 200 in 0.239 seconds. The same call with three and with five addresses returned HTTP 429, but the body was not an error. It was a mixed array holding real balance objects alongside per-address entries reading "HTTP error calling /v1/btc/main/addrs/{address}/balance: 429". Each address in a batch is billed as its own request, so the batch syntax trips the very rate limit it appears to help you avoid. Check every element of the array, never just the status code.

No 20-address ceiling

Pass twenty addresses or two hundred thousand in one call. The chain is already indexed and reconciled, so a bulk balance check is a single lookup against a table rather than thousands of round trips to a public explorer that throttles you partway through.

Every field, every row

Each address comes back with the confirmed balance to the satoshi, total received, total sent, transaction count, UTXO count, and first and last activity. Addresses with no on-chain history return an explicit zero, so your reconciliation never loses a row.

Bring the list into SQL

Load your address list as a table and join it against balances, entity labels, fund flows or the rich list in one statement. That turns a nightly cold-storage reconciliation or a counterparty screening list into a query instead of a script plus a spreadsheet.

Side by side

What actually happens when you pass several addresses to one endpoint

Every row below was requested from a single machine on 30 August 2026 and the response recorded as it came back. The addresses used were the genesis address, two published exchange cold wallets and one 62-character P2WSH address. No result here is quoted from documentation.

Endpoint Batch syntax it accepts What came back on 30 August 2026 Working ceiling
Blockstream Esplora None, comma is not parsed HTTP 400 in 0.55s, body reads legacy address base58 string One address per request
BlockCypher balance endpoint Semicolon between addresses HTTP 200 in 0.17s, a JSON array with one object per address 3 requests per second and 100 per hour on the free tier
Blockchair dashboards addresses Comma between addresses HTTP 430 in 0.27s, IP blacklisted, told to email for an API key Paid key required in practice
mempool.space address endpoint None HTTP 200 in 0.20s for a single address One address per request
Free web multi-address checkers Paste box, one per line Published caps of 20 and 50 addresses per submission 20 to 50 addresses
BitcoinDatabase List, CSV upload or a SQL join The whole address list resolved in one query Your plan limit, not a syntax limit

One result is worth more than the status codes, and it will silently corrupt a reconciliation if you miss it. BlockCypher accepts a semicolon-separated batch and does not return the objects in the order you requested them, so you must key results by address rather than by position. Re-probing on 17 September 2026 added a second trap on the same endpoint: batches of three and five addresses returned HTTP 429 overall, yet the body was a mixed array containing genuine balances for some addresses and per-address 429 error objects for the others. Code that reads only the status throws away good data, and code that reads only the body treats throttled addresses as though they hold nothing.

What it handles

The indexed Bitcoin chain, queryable your way

Look up an address, a transaction, a UTXO, the rich list or an on-chain metric, by REST API, SQL or dashboard. The same authoritative data, reconciled block-by-block against the canonical chain, without running a node.

  • Check thousands of Bitcoin addresses in one request
  • Upload a CSV or paste addresses one per line
  • Return balance, received, sent, tx count and UTXOs per address
  • Expand an xpub into its derived addresses and total them
  • Join your address list against labels and flows in SQL
  • Export the whole result set to CSV for audit files
GET /v1/address/{addr} query result
200 · JSON
{
  "address": "bc1qxy2k…l0wdv8",
  "balance_btc": 68432.10,
  "balance_usd": 4612165420,
  "tx_count": 1284,
  "unspent_outputs": 37,
  "first_seen": "2014-02-09"
}
indexed from genesis · to the satoshi ✓ reconciled block-by-block

Why BitcoinDatabase

One platform, queryable three ways

Not a raw node to sync, not an indexer to build, and not five vendors to stitch together. The fully-indexed Bitcoin blockchain, available as a REST API, as SQL, and as dashboards, on one authoritative dataset.

REST API

Typed JSON for addresses, transactions, balances, UTXOs and metrics. Drop it into apps, wallets, explorers and agents with curl, Python or any HTTP client.

SQL access

Run SQL directly against the indexed Bitcoin dataset for ad-hoc analysis, cohorts and exports, the same data the API and dashboards read from.

Compliance-first

Informational on-chain data and analytics only. Entity labels and flow tracing are framed as tooling to support a regulated team's own review, not accusations.

Good questions

Questions about Bulk balance checking

Give the checker your whole list at once instead of looking addresses up one by one. Paste the addresses one per line, upload a CSV, or pass the array to the API, and you get one row per address with its confirmed balance, total received and sent, and transaction count. Because the chain is pre-indexed, the size of the list does not change the method.
There is no small fixed ceiling here. Free web checkers typically cap a request at 20 or 50 addresses and ask you to split larger lists, which is the real limit people hit. On an indexed dataset the batch is bounded by your plan's query size rather than by an arbitrary address count, so exchange-scale lists of tens of thousands of addresses run as one job.
No, and you should never give one to a balance checker. A Bitcoin address and its balance are public information recorded on the blockchain, so the address alone is enough. A private key or seed phrase is what authorizes spending, and any site that asks for one in order to display a balance is attempting to steal the funds.
Blockchair documents a plural form, dashboards/addresses/{addr1},{addr2}, which is what most people are hunting for. The catch is access rather than syntax. We called it from a US cloud server on 3, 13 and 15 August 2026 and got HTTP 430 every time, with the response telling us our IP was temporarily blacklisted for API usage and to request a key. Blockstream Esplora and mempool.space have no plural address endpoint at all, so a batch there means one request per address.
Stop treating it as many small requests. Free endpoints throttle per IP, so a 10,000 address list becomes 10,000 calls that will trip a limit long before it finishes, and shared cloud IP ranges are often already throttled by someone else. Send the list as one batch against a pre-indexed dataset instead, where the whole set is a single query and the response time depends on your plan rather than on somebody else's traffic.
Yes. Upload a CSV with one address per row and the checker returns the same file back with balance, received, sent, transaction count and last activity appended to each row. That format is the reason most teams use bulk checking in the first place, since the output drops straight into a reconciliation sheet or an audit file.
Pasting addresses cannot move your coins, but it does reveal which addresses you care about, and a list submitted together implies those addresses share an owner. That is a privacy consideration rather than a theft risk. If the list is sensitive, prefer a provider with a stated retention policy over an anonymous free tool that logs queries you cannot audit.
Yes. An extended public key derives the whole address chain beneath it, so passing the xpub, ypub or zpub returns the derived addresses and their combined balance without you enumerating them. This is the practical way to check a wallet that generates a fresh address for every receive, where the address list is not fixed.
Because they are querying a public explorer API in a loop rather than holding the chain themselves. Each address in your list becomes a separate upstream request, so the cap protects the provider from being rate-limited. Reading from a pre-indexed copy of the chain removes that constraint, since one query serves the whole list.
It depends entirely on the endpoint, and the public ones are stricter than people expect. We tested four on 30 August 2026: Blockstream Esplora and mempool.space take one address per request, BlockCypher accepts a semicolon-separated batch on a free tier capped at 100 requests per hour, and Blockchair returned an IP blacklist. BitcoinDatabase resolves the whole list in one query.
Yes, comma separation is the documented syntax for that endpoint, but access is the real constraint rather than the syntax. Requesting two addresses that way on 30 August 2026 returned HTTP 430 with a message that the IP was temporarily blacklisted for exceeding API usage and an instruction to email for an API key. Plan on a paid key for any batch work there.
No, and this is the trap worth knowing about. Sending the same three addresses in three different orders on 30 August 2026 produced a response order that differed from the request order every time. Match each result to its address using the address field inside each object. Reading the array by position will assign balances to the wrong addresses and throw no error.
Because it is not a batch endpoint and never was. Passing two addresses joined by a comma on 30 August 2026 returned HTTP 400 with the body legacy address base58 string, which shows the endpoint tried to parse the entire comma-joined string as one address. There is no hidden batch mode to discover there.
In SQL, load your addresses as a list and join them against the address table in a single statement rather than looping one lookup per address. Be clear about what you are joining: balances and transaction history are exact arithmetic from the chain, while entity labels are inference and come from separate datasets you bring in yourself.
Because each address inside the batch counts as a separate request against its free limit of 3 per second and 100 per hour, so a three-address batch is three requests fired at once. We measured this on 17 September 2026: one address returned HTTP 200 in 0.239 seconds, while three and five addresses both returned HTTP 429. The dangerous part is that the body still contained real balances for some addresses and error objects for the rest.
Yes, but almost no public endpoint will do it in one call. Esplora and mempool.space accept one address per request, so five addresses took 3.035 seconds sequentially when we timed it on 17 September 2026. Blockchair documents comma-separated batching and returned HTTP 430 with our IP blacklisted. BlockCypher accepts semicolons and then rate limits the batch. Bulk checking works properly only against an indexed chain you can query as a set.

Explore more

More ways to query Bitcoin with BitcoinDatabase

Stop running a node. Just query Bitcoin.

Run your first query now and get on-chain data back by REST API, SQL or dashboard, with address history back to the genesis block over REST. Informational on-chain data only, not financial advice.

See pricing

History from genesis over REST · SQL · dashboards · addresses, transactions, UTXOs, metrics