Call the free Ethereum balance API endpoint
The address goes in the path. Nothing else is required, and there is no header to set.
curl https://aisenseapi.com/services/v1/ethereum/balance/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045{
"wallet": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"balance_eth": "6.635339380601433797",
"balance_wei": "6635339380601433797"
}That is a well known public Ethereum mainnet address, which makes it a comfortable example. Anyone can look it up in a block explorer and check the figure, so nobody has to borrow a stranger's address for a screenshot.
Balances move. The number above was correct when this page was written, and a live call returns whatever the address holds now. Treat any figure in documentation, including this one, as a snapshot rather than a constant to assert in a test.
Because it is a plain GET, a browser address bar works just as well as curl.
Response fields
Three fields come back. All three are present on every successful call, and all three are strings.
| Field | Type | Description |
|---|---|---|
| wallet | string | The address exactly as it appeared in the request path, casing included. It is a copy of your input, not a normalised form. |
| balance_eth | string | Balance in ether, always written with 18 decimal places. |
| balance_wei | string | Balance in wei, the base unit. One ether is 1000000000000000000 wei. |
An address with no ether is not an error. It answers with HTTP 200 and a pair of zeros:
{
"wallet": "0xb24B0d314Cfcb47A9fBb3e448B13A1c56ee301a8",
"balance_eth": "0.000000000000000000",
"balance_wei": "0"
}Note the padding. Since the ether field always carries 18 decimals, comparing it against "0" reports a funded wallet even when the wallet is empty. Test balance_wei instead.
Both balance values are strings, not numbers
This is the single most common way to get a wrong number out of this lookup, so it is worth being precise about. The free Ethereum balance API endpoint quotes both figures, and that is deliberate rather than sloppy.
Why wei does not fit in a floating point number
Balances are reported to the last wei. A JavaScript number is an IEEE-754 double, which represents integers exactly only up to 9007199254740991. The balance above, 6635339380601433797 wei, is nine orders of magnitude past that limit.
Parse it with Number() or parseFloat() and you get 6635339380601434112. That is 315 wei more than the real balance. No exception, no warning, just a quietly wrong figure that survives every later calculation.
The ether field is no safer. The value 6.635339380601433797 carries 18 decimal places, a double holds roughly 17 significant digits, and parseFloat hands back 6.635339380601434 with the tail of the balance simply gone.
What to do instead
Keep both fields as strings, from the response all the way to storage. Quotation marks in the JSON are the whole point, so do not let a helper strip them on the way in.
When you need arithmetic, load balance_wei into an arbitrary-precision integer type. Use BigInt in JavaScript, the built-in int in Python, BigInteger in Java, or math/big in Go. In a database, pick a fixed-point decimal column or a string column rather than a float.
Divide down to ether only at the moment of display, and do that division on the integer rather than on a float.
Read only, and safe for any address
This lookup takes an address and nothing else. An address is public information by design, so there is no secret to leak and no risk in calling it for an address you care about.
That is worth stating plainly, because the neighbouring endpoint is a different matter. The Ethereum Wallet API endpoint creates a private key on a remote server and sends it back over the network, which makes every key it produces test material and never a place for real funds.
The free Ethereum balance API endpoint never sees a private key, because it never needs one. It reads what the chain already publishes. Watching an address is not the same as controlling it, and nothing here moves value in any direction.
What a malformed address returns
The route only matches 0x followed by exactly 40 hex characters. One character short, or an ENS name instead of an address, and the request never reaches the balance handler.
curl https://aisenseapi.com/services/v1/ethereum/balance/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA9604{"error":"Unknown endpoint. See https:\/\/www.aisense.no\/free-public-apis for the reference."}That answer arrives with HTTP 404. Do not read it as proof that the address holds nothing, because an empty address still returns HTTP 200 and a zero balance. Check the status code, not the shape of the body.
One more thing about casing. The lookup accepts an address in upper, lower or mixed case and echoes back exactly what you sent. Normalise addresses yourself before using them as cache or database keys, or the same wallet will occupy several rows.
Common uses
Watch only dashboards
Poll a treasury, donation or contract address and render its holdings on a panel without running a node.
Balance alerts
Compare the wei value against a threshold on a schedule and raise a notification when it crosses.
Precision tests
Feed a real 19 digit wei figure through your parsing code and confirm nothing rounds on the way in.
Teaching material
Show a class the same amount written in wei and in ether, side by side, in one request.
Agent tools
Give a language model a single unauthenticated call that answers a plain question about a public address.
Reconciliation checks
Cross check a figure from your own indexer against an independent read of the same address.
Privacy and limits
The address travels in the URL path, so it appears in request logs along the way. Ethereum addresses and their balances are public chain data, so nothing secret leaks, but the log does connect an IP to an interest in one particular wallet.
Every call to the free Ethereum balance API endpoint counts against one service wide budget: 5000 requests per IP per 24 hours, with no API key and no account. Balances change only when a block confirms, so cache a result for a few seconds instead of polling in a tight loop.
The base URL for everything here is https://aisenseapi.com/services/v1. The same limit and the same open access apply across the whole catalogue of free public REST APIs.