A read-only custom integration for Bitpanda's new Public API. One config entry represents one Bitpanda account and exposes portfolio totals plus per-asset balances, valuation, acquisition price, and return metrics.
This is deliberately separate from
defi_portfolio:
Bitpanda is a centralized-custody account, not a wallet on one EVM chain.
The integration uses only the new API at https://api.public.bitpanda.com:
GET /v1/portfoliosupplies balances, invested amounts, average buy prices, current values, total returns, and return percentages.GET /v1/assetssupplies stable asset UUIDs, names, symbols, types, and groups.GET /v1/currenciesresolves EUR and its stable UUID.GET /v1/earn/configssupplies APR, mode/type, enabled, and sold-out status for Earn products.
The integration does not reconstruct cost basis from trades. Bitpanda's own portfolio accounting remains authoritative. Missing API values remain unavailable. The client accepts both the camelCase field names in the published OpenAPI schema and the snake_case field names currently returned by the live API.
Add this repository to HACS as a custom integration repository, install Bitpanda Portfolio, and restart Home Assistant. Then add the integration from Settings → Devices & services → Add integration.
Create an API key in Bitpanda → Account Settings → API with only the Read
scope. Paste it into the config flow. The key is stored as config-entry secret,
sent only as x-api-key, and redacted from diagnostics.
Portfolio entities:
- API status (
complete,partial, orunavailable) with explicit errors - current value
- invested amount
- total return
- total return percentage
Each discovered asset exposes:
- amount, available amount, and derived committed amount/percentage
- invested amount
- average buy price
- current value and derived current price
- total return and total return percentage
- Earn APR when exactly one configuration exists
- an Earn availability binary sensor
Earn availability means that at least one configuration is enabled and not sold
out. It does not guarantee regional or account eligibility. STAKING_EARN denotes
proof-of-stake products and STABLE_COIN_EARN denotes Bitpanda's stablecoin
lending product. FLEXIBLE and LOCKED are exposed as API-native attributes;
the API does not supply the corresponding unlock duration.
Committed amount is calculated as balance - available_balance, clamped at zero.
It is deliberately not named "staked amount" because pending account restrictions
could produce the same balance difference.
Discovery runs on every refresh. A non-zero asset first returned after setup is added automatically with the complete sensor set above. Fiat cash balances are also exposed; reporting-currency cash contributes to current portfolio value but is excluded from investment cost and return totals because Bitpanda does not provide performance fields for cash.
Entity discovery does not depend on generated entity IDs. Every entity exposes
integration_domain, config_entry_id, resource_type, resource_id, and
metric_id; asset entities also expose asset_id and asset_symbol.
Zero-balance holdings are hidden by default and can be enabled in integration options. A hidden zero-balance asset will be discovered automatically if its balance later becomes non-zero. The default polling interval is 15 minutes, with a minimum of 5 minutes. This is well below Bitpanda's documented read limit of 300 requests per minute and 3,000 per hour.
- Display currency is EUR because the initial use case and source portfolio use EUR. The API model keeps the stable currency UUID so additional currencies can be added without changing entity identity.
- No custom Lovelace card is included initially. Standard Home Assistant entity, gauge, statistics, and history cards cover these sensors well.
- Portfolio history and operations endpoints are not polled. Recorder provides Home Assistant history from the current snapshot onward.
- Earn reward history is not aggregated yet. The operations endpoint can support this later without changing the current entity identities.
uv sync --locked --dev
uv run ruff check custom_components tests tests_ha
uv run ruff format --check custom_components tests tests_ha
uv run pytest -quv sync creates the repository-local .venv from the committed uv.lock.
MIT