This guide explains how to retrieve wallet balances from one or multiple blockchains using the BCReader API. You can get balances for a specific blockchain or retrieve multi-blockchain and multi-token balances in a single request.
The Balances API uses a generic proxy pattern to route requests to BCReader. The IBEx.Fi API provides a transparent proxy endpoint that forwards requests to the BCReader API, which handles the actual balance queries.
The proxy endpoints are:
:verb is balances)For balances, you call:
/api/balances/api/v1.1/balancesUse this endpoint to retrieve the balance for a wallet address on a specific blockchain. This routes through the generic proxy to BCReader's /api/balances endpoint.
Endpoint : GET /v1.1/bcreader/balances (via generic proxy GET /v1.1/bcreader/:verb)
Headers :
Authorization: Bearer <access_token> (required)X-Blockchain-Id: <chainId> (optional) : Target blockchain ID. If omitted, uses default chainQuery Parameters :
address (string, optional) : Safe address. If omitted, uses the first Safe of the authenticated userRequest Example :
GET /v1.1/bcreader/balances?address=0xd676c6188195372EC269E9C2cAf815C56436A679 Authorization: Bearer <access_token> X-Blockchain-Id: 421614
Response (200 OK) :
{
"timestamp": "2025-06-02T13:30:45Z",
"balance": {
"address": "0xd676c6188195372EC269E9C2cAf815C56436A679",
"balance": "25.000"
}
}
address is omitted, the API automatically uses the first Safe address of the authenticated user for the current rpId.
Use this endpoint to retrieve detailed token balances across one or multiple blockchains, with optional price data. This routes through the generic proxy to BCReader's /api/v1.1/balances endpoint.
Endpoint : GET /v1.1/bcreader/v1.1/balances or GET /v1.1/bcreader/balances (via generic proxy)
Headers :
Authorization: Bearer <access_token> (required)X-Blockchain-Id: <chainId> (optional) : Target blockchain ID. If omitted, returns balances for all configured blockchainsQuery Parameters :
address (string, required) : Safe address to querytokenAddress (string, optional) : Filter by specific token addresssymbol (string, optional) : Filter by token symbolincludeNative (boolean, optional) : Include native token (ETH, etc.)includeZero (boolean, optional) : Include tokens with zero balanceincludePrices (boolean, optional, default: true) : Include real-time price data (USD/EUR)startDate (string, optional) : Filter by start date (YYYY-MM-DD)endDate (string, optional) : Filter by end date (YYYY-MM-DD)When X-Blockchain-Id header is provided:
Request Example :
GET /v1.1/bcreader/v1.1/balances?address=0xd676c6188195372EC269E9C2cAf815C56436A679 Authorization: Bearer <access_token> X-Blockchain-Id: 421614
Response (200 OK) :
{
"timestamp": "2025-06-02T13:30:45Z",
"blockchainId": "421614",
"balance": {
"tokens": [
{
"tokenAddress": "0xEURE12345678901234567890123456789012345678",
"primaryAddress": "0xEURE12345678901234567890123456789012345678",
"secondaryAddress": null,
"active": true,
"symbol": "EURE",
"decimals": 18,
"balance": "25.000",
"status": "MATCH",
"source": "DB",
"price_usd": 1.08,
"price_eur": 0.92,
"value_usd": "27.00",
"value_eur": "23.00",
"price_updated_at": "2025-06-02T13:30:00Z",
"price_source": "coinbase"
}
],
"summary": {
"mismatches": 0,
"total": 1,
"total_value_usd": "27.00",
"total_value_eur": "23.00"
}
},
"prices_available": true
}
When X-Blockchain-Id header is omitted, returns balances for all configured blockchains:
Request Example :
GET /v1.1/bcreader/v1.1/balances?address=0xd676c6188195372EC269E9C2cAf815C56436A679 Authorization: Bearer <access_token>
Response (200 OK) :
{
"timestamp": "2025-06-02T13:30:45Z",
"balances": {
"421614": {
"balance": {
"tokens": [
{
"tokenAddress": "0xEURE12345678901234567890123456789012345678",
"primaryAddress": "0xEURE12345678901234567890123456789012345678",
"secondaryAddress": null,
"active": true,
"symbol": "EURE",
"decimals": 18,
"balance": "25.000",
"status": "MATCH",
"source": "DB"
}
],
"summary": {
"total": 1
}
}
},
"100": {
"balance": {
"tokens": [
{
"tokenAddress": "0xEURE12345678901234567890123456789012345678",
"primaryAddress": "0xEURE12345678901234567890123456789012345678",
"secondaryAddress": null,
"active": true,
"symbol": "EURE",
"decimals": 18,
"balance": "50.25",
"status": "MATCH",
"source": "DB"
}
],
"summary": {
"total": 1
}
}
}
}
}
timestamp : Balance snapshot timestamptokens : Array of token balances with metadatasummary.total_value_usd : Total portfolio value in USD (if prices enabled)summary.total_value_eur : Total portfolio value in EUR (if prices enabled)blockchainId : Blockchain ID (single blockchain response)balances : Object keyed by blockchain ID (multi-blockchain response)tokenAddress : ERC20 token contract addressprimaryAddress : Primary token addresssecondaryAddress : Secondary token address (if applicable)active : Whether the token is activesymbol : Token symbol (e.g., "EURE", "USDC")decimals : Token decimals (e.g., 18)balance : Human-readable balance (string)status : Balance status ("MATCH", "MISMATCH", etc.)source : Data source ("DB", "RPC", etc.)price_usd : Token price in USD (if includePrices=true)price_eur : Token price in EUR (if includePrices=true)value_usd : Token value in USD (balance × price_usd)value_eur : Token value in EUR (balance × price_eur)price_updated_at : Last price update timestampprice_source : Price data source (e.g., "coinbase")total : Total number of tokensmismatches : Number of tokens with mismatched balancestotal_value_usd : Total portfolio value in USD (if prices enabled)total_value_eur : Total portfolio value in EUR (if prices enabled)You can filter balances by specific token address or symbol:
GET /v1.1/bcreader/v1.1/balances?address=0xd676c6188195372EC269E9C2cAf815C56436A679&tokenAddress=0xEURE12345678901234567890123456789012345678 Authorization: Bearer <access_token>
To include the native blockchain token (ETH, etc.):
GET /v1.1/bcreader/v1.1/balances?address=0xd676c6188195372EC269E9C2cAf815C56436A679&includeNative=true Authorization: Bearer <access_token>
To include tokens with zero balance:
GET /v1.1/bcreader/v1.1/balances?address=0xd676c6188195372EC269E9C2cAf815C56436A679&includeZero=true Authorization: Bearer <access_token>
To disable price data (faster response):
GET /v1.1/bcreader/v1.1/balances?address=0xd676c6188195372EC269E9C2cAf815C56436A679&includePrices=false Authorization: Bearer <access_token>
You can optionally include balance data in the sign-in response by setting includeBalance: true in the sign-in request body:
Request Example :
POST /v1.2/auth/sign-in
Content-Type: application/json
{
"credential": { ... },
"includeBalance": true
}
Response (200 OK) :
{
"access_token": "...",
"refresh_token": "...",
"safeAddress": { ... },
"balance": {
"timestamp": "2025-06-02T13:30:45Z",
"balance": {
"address": "0xd676c6188195372EC269E9C2cAf815C56436A679",
"balance": "25.000"
}
}
}
includeBalance is not set or is false, the balance field will not be included in the response.
If the JWT is missing or invalid, you will receive a 401 error. Make sure to include a valid Authorization header.
If the wallet address is not found or the user has no Safe addresses, you will receive a 404 error.
If the address format is invalid, you will receive a 400 error.
X-Blockchain-Id header for single blockchain, omit for all blockchainsincludeBalance: true in sign-in requestsaddress is omitted in v1, the API uses the first Safe of the authenticated userX-Blockchain-Id for all blockchains)includePrices=false to disable)This section provides detailed technical information for AI systems integrating the IBEX wallet balances flow, including architecture patterns, data models, and implementation details.
Generic Proxy Pattern
GET /v1.1/bcreader/:verb and POST /v1.1/bcreader/:verb:verb is balances, so you call GET /v1.1/bcreader/balancesGET /v1.1/bcreader/balances
GET /v1.1/bcreader/:verb with verb=balancesGET /api/balancesaddress omitted, uses first Safe of authenticated userX-Blockchain-Id header or query parameter (forwarded to BCReader)GET /v1.1/bcreader/v1.1/balances
GET /v1.1/bcreader/:verb with verb=v1.1/balances or GET /v1.1/bcreader/balancesGET /api/v1.1/balancesX-Blockchain-Id: Returns single blockchain responseX-Blockchain-Id: Returns multi-blockchain responsetokenAddress, symbol query parameters (forwarded to BCReader)APIPRICE_ENABLED=true on BCReader)Single Blockchain Response:
{
"timestamp": "ISO-8601 timestamp",
"blockchainId": "string (chain ID)",
"balance": {
"tokens": [
{
"tokenAddress": "0x...",
"primaryAddress": "0x...",
"secondaryAddress": "0x... | null",
"active": boolean,
"symbol": "string",
"decimals": number,
"balance": "string (human-readable)",
"status": "MATCH | MISMATCH",
"source": "DB | RPC",
"price_usd": number,
"price_eur": number,
"value_usd": "string",
"value_eur": "string",
"price_updated_at": "ISO-8601 timestamp",
"price_source": "string"
}
],
"summary": {
"total": number,
"mismatches": number,
"total_value_usd": "string",
"total_value_eur": "string"
}
},
"prices_available": boolean
}
Multi-Blockchain Response:
{
"timestamp": "ISO-8601 timestamp",
"balances": {
"blockchainId1": {
"balance": {
"tokens": [...],
"summary": {...}
}
},
"blockchainId2": {
"balance": {
"tokens": [...],
"summary": {...}
}
}
}
}
Price Data:
includePrices=true)APIPRICE_ENABLED=true on BCReaderprice_usd, price_eur, value_usd, value_eurStatus Values:
MATCH : Balance matches between DB and on-chainMISMATCH : Balance discrepancy detectedSource Values:
DB : Balance from database (cached)RPC : Balance from blockchain RPC (live)Sign-In Integration:
includeBalance: true in sign-in request bodybalance fieldWebSocket Integration:
balance_datasrc/routes/v1.1/bcreader.ts : Generic proxy endpoints (GET /v1.1/bcreader/:verb, POST /v1.1/bcreader/:verb)src/clients/BCReader.ts : BCReader API client (handles actual BCReader communication)src/routes/v1/auth.ts : Sign-in integration with includeBalancedocs/BCREADER_ENDPOINTS_v1.1.en.md : Complete BCReader API documentationGET /v1.1/bcreader/balances?address=0x... or GET /v1.1/bcreader/v1.1/balances?address=0x...includePrices=true, BCReader fetches real-time prices