Menu
Bitcoin Python Executable Jan 31, 2026

Check Bitcoin Address Balance

Query any Bitcoin address balance using the mempool.space API

#balance #mempool #api #address

Overview

Query the balance of any Bitcoin address using the mempool.space API. This is a read-only operation that requires no authentication.

The Code

"""
Bitcoin Address Balance Checker
Query any address balance via mempool.space API

Requirements: requests (pip install requests)
"""

import requests
from typing import Optional

MEMPOOL_API = "https://mempool.space/api"

def get_address_balance(address: str, testnet: bool = False) -> dict:
    """
    Get the balance of a Bitcoin address.

    Args:
        address: Bitcoin address (any format)
        testnet: Use testnet API if True

    Returns:
        dict with confirmed and unconfirmed balances in satoshis
    """
    base_url = "https://mempool.space/testnet/api" if testnet else MEMPOOL_API

    response = requests.get(
        f"{base_url}/address/{address}",
        timeout=10
    )
    response.raise_for_status()

    data = response.json()

    # Chain stats = confirmed, mempool stats = unconfirmed
    chain = data.get("chain_stats", {})
    mempool = data.get("mempool_stats", {})

    confirmed = chain.get("funded_txo_sum", 0) - chain.get("spent_txo_sum", 0)
    unconfirmed = mempool.get("funded_txo_sum", 0) - mempool.get("spent_txo_sum", 0)

    return {
        "address": address,
        "confirmed_sats": confirmed,
        "unconfirmed_sats": unconfirmed,
        "total_sats": confirmed + unconfirmed,
        "confirmed_btc": confirmed / 100_000_000,
        "total_btc": (confirmed + unconfirmed) / 100_000_000,
        "tx_count": chain.get("tx_count", 0)
    }


def get_utxos(address: str, testnet: bool = False) -> list:
    """
    Get unspent transaction outputs for an address.

    Args:
        address: Bitcoin address
        testnet: Use testnet API if True

    Returns:
        List of UTXOs with txid, vout, value
    """
    base_url = "https://mempool.space/testnet/api" if testnet else MEMPOOL_API

    response = requests.get(
        f"{base_url}/address/{address}/utxo",
        timeout=10
    )
    response.raise_for_status()

    utxos = response.json()

    return [{
        "txid": utxo["txid"],
        "vout": utxo["vout"],
        "value_sats": utxo["value"],
        "value_btc": utxo["value"] / 100_000_000,
        "confirmed": utxo["status"]["confirmed"]
    } for utxo in utxos]


# Example usage
if __name__ == "__main__":
    # Satoshi's genesis address (for demonstration)
    address = "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"

    try:
        balance = get_address_balance(address)
        print(f"Address: {balance['address']}")
        print(f"Confirmed: {balance['confirmed_sats']:,} sats ({balance['confirmed_btc']:.8f} BTC)")
        print(f"Unconfirmed: {balance['unconfirmed_sats']:,} sats")
        print(f"Transactions: {balance['tx_count']}")

        utxos = get_utxos(address)
        print(f"\nUTXOs: {len(utxos)}")
        for utxo in utxos[:3]:  # Show first 3
            print(f"  {utxo['txid'][:16]}... : {utxo['value_sats']:,} sats")

    except requests.RequestException as e:
        print(f"API error: {e}")

Usage

# Install dependency
pip install requests

# Run the script
python check_balance.py

Example Output

Address: 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
Confirmed: 7,259,433,859 sats (72.59433859 BTC)
Unconfirmed: 0 sats
Transactions: 3,542

UTXOs: 3542
  4a5e1e4baab89f3a... : 5,000,000,000 sats
  ...

Agent Notes

Rate limits: mempool.space has no strict rate limits but be respectful. For high-volume queries, run your own mempool instance.

Address formats supported:

  • P2PKH (legacy): 1...
  • P2SH (SegWit wrapped): 3...
  • P2WPKH (native SegWit): bc1q...
  • P2TR (Taproot): bc1p...

Error handling: Always wrap API calls in try/except. Network errors and invalid addresses will raise exceptions.